在Delphi 2009中,TList<>
是一个泛型类,用于存储对象。IndexOf
方法用于查找指定对象在列表中的索引。如果在列表中找不到指定对象,则返回-1。
在某些情况下,使用IndexOf
方法可能会导致程序崩溃。这通常是由于比较对象时出现问题。为了解决这个问题,您可以:
Equals
方法。Equals
方法用于比较两个对象是否相等。在IndexOf
方法中,它将使用Equals
方法来比较列表中的对象和指定对象。TMyObject = class
// ...
public
function Equals(Obj: TObject): Boolean; override;
// ...
end;
function TMyObject.Equals(Obj: TObject): Boolean;
begin
Result := (Obj is TMyObject) and (Self.SomeProperty = TMyObject(Obj).SomeProperty);
end;
Equals
方法,或者希望使用不同的比较方式,可以使用自定义比较器。自定义比较器是一个实现IComparer<T>
接口的类。TMyComparer = class(TInterfacedObject, IComparer<TMyObject>)
// ...
public
function Compare(const Left, Right: TMyObject): Integer;
// ...
end;
function TMyComparer.Compare(const Left, Right: TMyObject): Integer;
begin
if Left.SomeProperty< Right.SomeProperty then
Result := -1
else if Left.SomeProperty > Right.SomeProperty then
Result := 1
else
Result := 0;
end;
然后,在调用IndexOf
方法时,传递自定义比较器。
var
MyList: TList<TMyObject>;
MyObject: TMyObject;
Comparer: IComparer<TMyObject>;
Index: Integer;
begin
MyList := TList<TMyObject>.Create;
try
// ...
MyObject := TMyObject.Create;
// ...
Comparer := TMyComparer.Create;
Index := MyList.IndexOf(MyObject, Comparer);
// ...
finally
MyList.Free;
end;
end;
这样,您就可以避免IndexOf
方法中的崩溃问题。
领取专属 10元无门槛券
手把手带您无忧上云