Generic List: Predicate()
-
Hallo,
ich habe eine generische Liste mit Objekten einer von mir erstellen Klasse:System::Collections::Generic::List<game^> games;
ref class game { private: System::String ^title; System::String ^path; System::String ^param; System::Collections::Generic::List<server^> ^list; public: game(void); [ein paar Methoden...] };
Jetzt würde ich gerne auf bestimmte Elemente der Liste zugreifen (zB wenn der Titel gleich "xyz" ist). Mein derzeitiges "Workaround" sieht so aus:
for each(game ^obj in games) { if(this->listGames->SelectedItem->ToString() == obj->getTitle()) { form->obj = obj; break; } }
Ich weiss, dass ich nicht innerhalb einer foreach-Schleife die Elemente direkt ändern kann. Daher weise ich einfach einer anderen Variable das Element zu.
Die perfekte Methode wäre eigentlich find(), aber ich komm mit diesem Predicate() nicht klar.Ich habs so wie im Beispiel der find()-Methode versucht:
Console::WriteLine("\nFind(EndsWithSaurus): {0}", dinosaurs->Find(gcnew Predicate<String^>(EndsWithSaurus)));
game ^test = gcnew game(); test->setTitle("test"); test->setParam(""); test->setPath(""); this->games.Find(gcnew Predicate<game ^>(test));
Funktioniert aber nicht, sonst wär ich nicht hier.
Im Grunde ist es das selbe wie in diesem Thread. Nur komme ich mit dem Predicate-Beispiel auch nicht weiter.Ich denke mal, ich brauche eine bool-Funktion - nur wie genau das aussehen soll, weiß ich nicht. Google´n brachte mich auch nicht weiter...
Kennt vielleicht jemand eine Seite, auf der das mit den Predicates mal erklärt ist?Danke.
-
Ist der Schlüssel immer vom selben Typ?
Dann würde ich eine SortedList anstatt der List nehmen.
-
Vollständiges Beispiel:
using namespace System; using namespace System::Collections::Generic; ref class game { public: game(String^ s) : Title(s) {} System::String ^Title; }; ref struct EqualsGameTitle { EqualsGameTitle(String^ s) : CompareTo(s) {} String^ CompareTo; bool Match(game^ g) { if (g->Title == CompareTo) return true; return false; } }; int main() { List<game^> l; l.Add(gcnew game("Hallo")); l.Add(gcnew game("Welt")); game^ g = l.Find(gcnew Predicate<game^>(gcnew EqualsGameTitle("Welt"), &EqualsGameTitle::Match)); if(g != nullptr) Console::WriteLine(g->Title); else Console::WriteLine("Nicht gefunden); }
PS: Du kannst auch nächste Woche an meiner C++/CLI-Schulung teilnehmen
-
Hey danke! Werde ich gleich mal ausprobieren...
-
Ich rate Dir von den ganzen neuen "Features" ab, da es aktuell zu viel arbeit ist diese zu verwenden... das ganze macht erst sinn, wenn C++/CLI auch anonyme methoden unterstützt (VS2010)...
-
Meinst du die generische Liste?
Wie würdest du derzeit in VC++ solche Objekte verwalten?
-
Nein, ich meine das Predicate... Generische Listen sind super... kannst aber auch STL/CLR verwenden...