AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Generic ObjectList und Suchen - Wie am besten ?

Ein Thema von OlafSt · begonnen am 6. Aug 2014 · letzter Beitrag vom 6. Aug 2014
Antwort Antwort
Seite 1 von 3  1 23      
OlafSt

Registriert seit: 2. Mär 2007
Ort: Hamburg
284 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Generic ObjectList und Suchen - Wie am besten ?

  Alt 6. Aug 2014, 10:30
Delphi-Version: XE4
Hallo Freunde,

heute mal was für Generic-Anfänger, wie ich es bin. Bisher hab ich die Dinger immer nur benutzt - das soll sich nun ändern.

Ich habe immer wieder das Problem, das ich Objekte en masse in ObjectLists speichern und immer wieder das eine oder andere Objekt in dieser Liste suchen muß. Generics waren eine - wenn auch sehr codeaufblähende - prima Lösung. Nur das Gesuche ist noch immer "doof".

Ich habe nun vor, mich dem Problem schrittweise zu nähern. Meine erste Idee:
Delphi-Quellcode:
type
   TMyObjectList<T> = class(TObjectList<T>);
Das funktioniert offenbar, weil es ohne Error compiliert Okay.
Delphi-Quellcode:
type
   TMyObjectList<T> = class(TObjectList<T>);
   public
      function Search(ASearchCrit: integer): T;
   end;
[...]
function TMyObjectList<T>.Search(ASearchCrit: integer): T;
begin
   for Result in Self do
   begin
      if Result. //<--- Äh... Das funktioniert nicht. Gar nicht
   end;
end;
Wie man sieht, ist mein Ansatz eine direkte Fahrt gegen die Wand. Zwei Fragen:

1. Wie löst man sowas ?
2. Da in TMyObjectList irgendwas gestopft werden kann - bin ich gezwungen, alle möglichen Typen zuerst abzutesten oder gibt es da auch eine clever Lösung ?
Delphi-Quellcode:
Result:=true;
if T is TDriver then exit;
if T is TSpecialDriver then exit;
if T is TExtraSpecialDriver then exit;
Result:=false;
Thanks für die Schubser,

Olaf
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Generic ObjectList und Suchen - Wie am besten ?

  Alt 6. Aug 2014, 10:46
Haben die Typen eine gemeinsamen Vorfahren? Soll einer davon ausgeschlossen werden? Wenn Ja, kannst du die Anweisungen zusammenfassen:
if T in [ TDriver, TSpecialDriver, TExtraSpecialDriver, ...] then Result := True else Result := False; Wenn es für alle Nachfahren einer Klasse gelten soll prüfe gegen diese.
Markus Kinzler
  Mit Zitat antworten Zitat
OlafSt

Registriert seit: 2. Mär 2007
Ort: Hamburg
284 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: Generic ObjectList und Suchen - Wie am besten ?

  Alt 6. Aug 2014, 10:49
Ah, eine gute Idee !

Die Klassen haben einen gemeinsamen Vorfahren und es reicht, gegen den zu testen:
Result:=(T is TDriverBase); Damit sind alle Nachfahren erfaßt und zulässig, alle anderen Klassen wie z.B. TComponent oder TWorkTime (völlig andere Unit) eliminiert.

Bleibt Problem 1.
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#4

AW: Generic ObjectList und Suchen - Wie am besten ?

  Alt 6. Aug 2014, 10:51
Ist ASearchCrit: Integer für alle zu unterstützenden Klassen in gleicher Weise die Suchbedingung?

Falls ja, könnte man entweder alle Klassen von einer ableiten die eine ID Property hat, und in der Schleife dann diese ID mit ASearchCrit vergleichen.

Alternativ könnte man ein Interface benutzen, das alle Klassen unterstützen und das diese ID Property definiert, auch dann kann ASearchCrit mit der ID verglichen werden.

Schliesslich gibt es noch die Möglichkeit Equals zu überschreiben. Doch das hat Risiken und Nebenwirkungen.
Michael Justin
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Generic ObjectList und Suchen - Wie am besten ?

  Alt 6. Aug 2014, 10:56
Warum erzeugst du dann nicht eine typisierte generische Objektliste?

Delphi-Quellcode:
  TMyObjectList<T> = class(System.Generics.Collections.TObjectList<TDriverBase>)
   public
      function Search(ASearchCrit: integer): T;
   end;
Problem 1 versteht ich nicht. Was willst Du machen?
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Puke
Puke

Registriert seit: 7. Nov 2012
123 Beiträge
 
Delphi XE5 Architect
 
#6

AW: Generic ObjectList und Suchen - Wie am besten ?

  Alt 6. Aug 2014, 11:02
Soweit ich verstanden habe, wird die List sehr groß. Wenn sowas passiert und man will darin suchen ... normalerweise sortiert man das Ding. Ansonsten kannst du nur eine Lineare Suche machen (Kann ziemlich lange dauern).

Pseudo Lineare Suche:
Delphi-Quellcode:
for AnfangListe to EndeListe do
begin
  if Element=Gesucht then
  begin
    Result = ElementIndex // Oder was auch immer
    Break;
  end;
end;
Wird das Ding aber immer schön sortiert kannst du eine Binäre Suche machen. Diese ist wesentlich schneller als die Lineare Suche. Da es ne Liste ist, gibt es soweit ich weiß keine andern Suchmöglichkeiten mehr. Der Algorithmus ist ein wenig schwieriger, aber immernoch ziemlich einfach, wenn man es Rekursiv macht.

Gruß
Puke
Gruß Puke
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#7

AW: Generic ObjectList und Suchen - Wie am besten ?

  Alt 6. Aug 2014, 11:09
Delphi-Quellcode:
type
  TMyObjectList<T> = class(TObjectList<T>);
  public
    function Search(const predicate: TPredicate<T>): T;
  end;
Einsatz:
Delphi-Quellcode:
myDriver := driverList.Search(
  function(d: TDriver): Boolean
  begin
    Result := d.Id = 1234
  end);
Vorteil: Du schränkst deine generische Listenklasse nicht auf bestimmte Suchkriterien ein, die nur für bestimmte Arten von T gelten.

Wenn dir das Schreiben der anonymen Methode zu unhandlich ist, kannst du das auch noch auslagern:

Delphi-Quellcode:
function DriverById(i: Integer): TPredicate<TDriver>;
begin
  Result :=
    function(d: TDriver): Boolean
    begin
      Result := d.Id = i;
    end;
end;
Einsatz:
Delphi-Quellcode:

myDriver := driverList.Search(DriverById(1234));
Eventuell kannst du dir auch Spring4D anschauen, die Listen dort unterstützen alle Arten von Suchen, Filtern, etc
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Generic ObjectList und Suchen - Wie am besten ?

  Alt 6. Aug 2014, 11:10
Er will ja aber nur Nachfahren einer bestimmte Klasse aufnehmen, deshalb erschien mir die Einschränkung sinnvoll.
Markus Kinzler
  Mit Zitat antworten Zitat
schöni

Registriert seit: 23. Jan 2005
Ort: Dresden
445 Beiträge
 
Delphi 7 Personal
 
#9

AW: Generic ObjectList und Suchen - Wie am besten ?

  Alt 6. Aug 2014, 11:20
Zitat:
Delphi-Quellcode:
type
  TMyObjectList<T> = class(TObjectList<T>);
Ab welcher Delphi Version funktioniert das?
Damit der Topf nicht explodiert, lässt man es ab und zu mal zischen.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Generic ObjectList und Suchen - Wie am besten ?

  Alt 6. Aug 2014, 11:23
Generics wurden in D2009 eingeführt
Markus Kinzler
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:43 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz