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;