Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Zugriff per schleife auf alle items eines TObjectDictionary


NOS1971 - Mi 05.02.14 17:21
Titel: Zugriff per schleife auf alle items eines TObjectDictionary
Hallo zusammen,

wie greife ich denn auf alle Items eines TObjectDictionary zu wie in einer for schleife und mit einem index ... oder geht da soetwas nicht ?


Grüßle,
Andreas


jfheins - Mi 05.02.14 17:47

da es von TEnumerable abgleitet ist, müsste es ja mit der for in Schleife gehen.

Index fällt flach, sowas hat ein Dictionary ja nicht. Aber wenn du alle Schlüssel kennst, kannst du auch diese hernehmen.


bummi - Mi 05.02.14 17:52

Du iteriserts über Keys oder Values.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
uses Generics.Collections;
type
TMyClass=Class
  ID:Integer;
  Value:String;
  //.....
  Constructor Create(aID:Integer;aValue:String);
End;

 TMyDictionary = TObjectDictionary<Integer, TMyClass>;


constructor TMyClass.Create(aID:Integer; aValue: String);
begin
 inherited Create;
 ID := aID;
 Value := aValue;
end;


procedure TForm3.Button1Click(Sender: TObject);
var
 i:Integer;
 obj:TMyClass;
 md:TMyDictionary;
 key:Integer;
 lob:TMyClass;
begin
  ReportMemoryLeaksOnShutDown := true;
  md:=TMyDictionary.Create([doOwnsValues]);

  for I := 0 to 10 do
      begin
        obj := TMyClass.Create(i , IntToStr(i));
        md.Add(i,obj);
      end;
  for key in md.Keys do
    Listbox1.Items.Add(md.Items[key].Value);

  Listbox1.Items.Add('__');


  for lob in md.Values do
    Listbox1.Items.Add(lob.Value);
  md.Free;
end;


Wenn Du es sortiert benötigst erzeugst Du eine sortierte Liste mit den Keys und greifst über md.Items[List[i]] auf die Items zu.


NOS1971 - Mi 05.02.14 18:45

Das Problem liegt dann daran das mein TObjectDictionary schon so aussieht

TMyDictionary = TObjectDictionary<String, TMyClass>;

Kann man das nachträglich nicht umwandeln sodass ein zugriff auf alle items möglich ist ...

eventuell gibt es ja eine möglichkeit auf alle items zuzugreifen ... egal in welcher reihenfolge aber auf alle halt ...


bummi - Mi 05.02.14 19:52

Der einzige Unterschied scheint mir zu sein dass Du String statt Integer verwendet hast,
wenn Du

Delphi-Quelltext
1:
key:String;                    

definierst kannst Du genauso zugreifen

Delphi-Quelltext
1:
2:
3:
for key in md.Keys do
   //irgendwas mit 
    md.Items[key].Value


jaenicke - Mi 05.02.14 20:23

Und zusätzlich gibt es noch ToArray bzw. Keys.ToArray, damit bekommst du ein Array zurück. Wenn du auf dem arbeitest, kannst du auch das Dictionary in der Schleife modifizieren. (Denn wenn du direkt über das Dictionary iterierst, kannst du dort keine Elemente hinzufügen oder löschen.)