Einzelnen Beitrag anzeigen

Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.015 Beiträge
 
Delphi 12 Athens
 
#4

AW: Funktion Needle und Array übergeben - aber generisch

  Alt 23. Jun 2018, 09:04
Der Rückgabewert von 0 für nicht gefunden ist vielleicht etwas ungeschickt, da er nicht von der erfolgreichen Suche nach dem ersten Elements unterschieden werden kann. Besser wäre es da wie anderswo auch eine -1 zurückzugeben.

Ich würde das analog aufbauen wie TArray.BinarySearch aus System.Generics.Collection:

Delphi-Quellcode:
interface

uses
  System.Generics.Default;

type
  TMyArray = class
  public
    class function IndexOf<T>(const Values: array of T; const Item: T): Integer; overload; static;
    class function IndexOf<T>(const Values: array of T; const Item: T; const Comparer: IEqualityComparer<T>): Integer; overload;
        static;
    class function IndexOf<T>(const Values: array of T; const Item: T; const Comparer: IEqualityComparer<T>; Index, Count:
        Integer): Integer; overload; static;
  end;

implementation

uses
  System.RtlConsts;

class function TMyArray.IndexOf<T>(const Values: array of T; const Item: T): Integer;
begin
  Result := IndexOf<T>(Values, Item, TEqualityComparer<T>.Default,
    Low(Values), Length(Values));
end;

class function TMyArray.IndexOf<T>(const Values: array of T; const Item: T; const Comparer: IEqualityComparer<T>): Integer;
begin
  Result := IndexOf<T>(Values, Item, Comparer,
    Low(Values), Length(Values));
end;

class function TMyArray.IndexOf<T>(const Values: array of T; const Item: T; const Comparer: IEqualityComparer<T>; Index, Count:
    Integer): Integer;
var
  I: Integer;
begin
  if (Index < Low(Values)) or ((Index > High(Values)) and (Count > 0))
    or (Index + Count - 1 > High(Values)) or (Count < 0)
    or (Index + Count < 0) then
    raise EArgumentOutOfRangeException.CreateRes(@SArgumentOutOfRange);

  Result := -1;
  for I := Index to Index + Count - 1 do begin
    if Comparer.Equals(Values[I], Item) then
      Exit(I);
  end;
end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming

Geändert von Uwe Raabe (23. Jun 2018 um 13:37 Uhr)
  Mit Zitat antworten Zitat