![]() |
TObjectlst - Index eines Objektes finden
Folgendes Problem: Ich möchte in einer TObjectList mehrere GLEICHARTIGE Objekte verwalten. Sagen wir mal, die Objekte haben z.B. alle eine "property ID : Integer...". Nun möchte ich beispielsweise den Index in der ObjectList von demjenigen Objekt herausfinden, welches die ID 37 hat. Eine entsprechende Methode habe ich leider nicht finden können, IMHO bleibt nur noch übrig, die ObjectList mittels Schleife zu durchlaufen und jedes Objekt auf die Eigenschaft ID=37 prüfen. Bei einem Treffer wäre der aktuelle Zähler der Index. Gibt es hierfür eine einfachere Lösung?
SCRaT |
Re: TObjectlst - Index eines Objektes finden
Zitat:
Nur wenn die Objekte nach ihren IDs sortiert sind, dann könnte man die Suche noch optimieren. |
Re: TObjectlst - Index eines Objektes finden
Danke!! Wollte nur nicht das Rad neu erfinden :) Dann mach ich es wohl so...
|
Re: TObjectlst - Index eines Objektes finden
Hallo Michael,
du könntest auch eine TStringList nehmen und dort zu den Objekten die ID als String hinterlegen. Die Suche über IndexOf() sollte speziell bei einer größeren Anzahl von Objekten relativ schnell gehen, sofern die Stringliste sortiert ist. Bei neueren Delphi-Versionen verfügt die Stringliste übrigens auch über die Eigenschaft OwnsObjects und kann somit die enthaltenen Objekte freigeben. Abhängig von der Anzahl der Objekte lohnt der Aufwand eventuell gar nicht, und du bist mit einer einfachen Suchschleife schneller. Gruß Hawkeye |
Re: TObjectlst - Index eines Objektes finden
Das habe ich auch im Sinn gehabt, muss mal schauen, welche von beiden Lösungen in meinem Fall am praktikabelsten ist. Danke trotzdem für den Tip! :cheers:
|
Re: TObjectlst - Index eines Objektes finden
Warum nicht die Vorteile von Delphi 2010 nutzen, wenn es schon verfügbar ist. (Geht grundsätzlich auch ohne Generika.)
Delphi-Quellcode:
program Project1;
{$AppType Console} uses SysUtils, Generics.Collections, Generics.Defaults; type TMyObject = class strict private FValue: Integer; public property Value: Integer read FValue write FValue; end; TMyComparer = class(TComparer<TMyObject>, IComparer<TMyObject>) function Compare(const Left, Right: TMyObject): Integer; end; TMyObjectList = class(TObjectList<TMyObject>) public constructor Create; function IndexOfValue(const Value: Integer): Integer; end; { TMyComparer } function TMyComparer.Compare(const Left, Right: TMyObject): Integer; begin Result := Left.Value - Right.Value; end; { TMyObjectList } constructor TMyObjectList.Create; begin inherited Create(TMyComparer.Create); end; function TMyObjectList.IndexOfValue(const Value: Integer): Integer; var Temp: TMyObject; begin Temp := TMyObject.Create; try Temp.Value := Value; Result := IndexOf(Temp); finally Temp.Free; end; end; { Hauptprogramm } var MyObjectList: TMyObjectList; MyObject: TMyObject; Index: Integer; begin try MyObjectList := TMyObjectList.Create; try for Index := 9 downto 0 do begin MyObject := TMyObject.Create; MyObject.Value := Index; MyObjectList.Add(MyObject); end; for Index := -1 to 10 do WriteLn(Format( 'MyObjectList.IndexOfValue(%3d) = %3d', [Index, MyObjectList.IndexOfValue(Index)] )); ReadLn; finally MyObjectList.Free; end; except on E: Exception do WriteLn(E.ClassName, ': ', E.Message); end; end.
Code:
MyObjectList.IndexOfValue( -1) = -1
MyObjectList.IndexOfValue( 0) = 9 MyObjectList.IndexOfValue( 1) = 8 MyObjectList.IndexOfValue( 2) = 7 MyObjectList.IndexOfValue( 3) = 6 MyObjectList.IndexOfValue( 4) = 5 MyObjectList.IndexOfValue( 5) = 4 MyObjectList.IndexOfValue( 6) = 3 MyObjectList.IndexOfValue( 7) = 2 MyObjectList.IndexOfValue( 8) = 1 MyObjectList.IndexOfValue( 9) = 0 MyObjectList.IndexOfValue( 10) = -1 |
Re: TObjectlst - Index eines Objektes finden
Habe zwar noch nie mit Generics zu tun gehabt, werde ich mir aber auf jeden Fall mal anschauen!!!!
Danke für den Code!!! SCRaT |
Re: TObjectlst - Index eines Objektes finden
Zitat:
|
Re: TObjectlst - Index eines Objektes finden
Zitat:
Es sei denn man sortiert diese Map, bzw. bereitet sie aufandere Weise, zu besseren Suche, auf. Aber die Suche nach Integer oder Hash ist doch eigentlich keinen großen Unterschied? :gruebel: |
Re: TObjectlst - Index eines Objektes finden
Zitat:
Ich glaub, ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:18 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz