Eintrag in SortedList ändern
-
Hallo wieder einmal.
Ich schlage mich gerade mit Objekten in einer SortedList herum und würde gerne einen Eintrag direkt in der Liste ändern und nicht erst herausholen, ändern und wieder eingliedern müssen.
ref struct Objekt { int a; };
System::Collections::SortedList^ Liste = gcnew System::Collections::SortedList; int k = 1; Liste->Add(k, meinObjekt); int i = Liste->GetByKey(k); Liste[i]->a = 5; // geht nicht Liste[i].a = 5; // funktioniert natürlich auch nicht Objekt^ tmp = safe_cast<Objekt^>(Liste->GetByIndex(i)); // der Compiler verlangt hier einen cast, da er ja ein System::Object^ übergibt tmp->a = 5; // sollte doch eigentlich genügen // aber ist nicht überprüfbar und // schreibt auch nicht direkt in das Objekt in der SortedList Liste->Remove(i); tmp->Add(k, tmp); // dieser Weg ist ziemlich umständlich
Gibt es einen Weg um auf das Objekt in der SortedList zugreifen zu können?
-
---
-
Kleine Korrektur:
Über tmp->a = 5 wird der Wert schon in der Struktur neu geschrieben. Die Frage bleibt jedoch, ob das auch ohne tmp geht.P.S.: Ich hatte das Beispiel aus meiner Erinnerung geschrieben. Oben heisst es natürlich RemoveAt (für einen Index) und Remove (für einen Schlüssel).
-
----
-
Lösung
safe_cast<Objekt^>(Liste->GetByIndex(i))->a = 5;
Sieht aber etwas... naja... schräg aus, oder?
-
Wieso sollte sich die Sortierung ändern, wenn man den Wert (nicht Key!) ändert?
Zum Ursprungsproblem:
Du kannst den Wert natürlich auch ohne tmp ändern, und zwar genauso wie mit tmp. Nur dass Du das Ergebnis des Cast nicht einer Variable zuweist sondern als Ausgangspunkt für den Zugriff benutzt. Aber nimm doch besser eine generic SortedList, dann kannst Du Dir das rumgecaste ganz sparen.BTW, so müsste es genauso wie über GetByIndex klappen:
safe_cast<Objekt^>(Liste[i])->a = 5;
-
LPCWSTR schrieb:
Sieht aber etwas... naja... schräg aus, oder?
Was erwartest Du wenn die Collection selbst mit Object^s rumhampelt?
-
Oh entschuldige Helium. Ich hatte Deinen ersten Post übersehen.
In meinem Fall ändern sich die Objekte noch, aber die Schlüssel bleiben gleich. Also die Schlüssel sind für mich "sortiert" und die Objekte können wohl nicht sortiert werden, da sie ja dem Typsystem insofern nicht bekannt sind (also wohl keine Kriterien für eine Sortierung existieren).
Natürlich könnte ich auch eine Hashlist verwenden. Ich brauche einfach nur ein dynamisches array.
-
Ja das stimmt schon. Hätte nur gehofft, dass .net hier gleich selbst sieht, welches Objekt (ist ja gekapselt) drin ist und somit die Member freigibt
-
ok, war zu dumm, korrekt zu lesen
-
Generic SortedList - guter Plan
Danke für eure Hilfe. Ich schau mir gleich die Generics an.
-
LPCWSTR schrieb:
Ja das stimmt schon. Hätte nur gehofft, dass .net hier gleich selbst sieht, welches Objekt (ist ja gekapselt) drin ist und somit die Member freigibt
Wie wäre es dann mit System::Collections::Generic::SortedList<int, Foo> statt System::Collections::SortedList?
/edit: zu langsam
-
System::Collections::Generic::SortedList<int, Foo>
Die werde ich verwenden. Danke nochmal für eure Hilfe.
P.S.: In diesem Thread hatte so ziemlich jeder Post eine gewisse Gleichzeigitkeit