Was ist eine alternative zu Wörterbüchern in C#, können für duplicate keys?
Habe ich eine Methode, die zurückgibt, Gruppen von Technikern, die gearbeitet haben, für bestimmte Projekte, zum Beispiel:
project 1 | John
project 1 | Tim
project 2 | John
project 2 | Dave
Habe ich ursprünglich versucht, um ein Wörterbuch zu erstellen, die in der Regel meine go-to-Kollektion von Schlüssel-Wert-Paare, aber in diesem Fall bin ich nicht in der Lage, es zu benutzen, weil ich kann keine doppelten Schlüssel (das Projekt). Was ist die alternative, die ich verwenden kann?
Mein einziger Gedanke ist die Schaffung eines Dictionary<Project, List<Technicians>>
aber gibt es etwas, was viel einfacher?
- Wörterbuch sichergestellt, dass Sie nicht haben doppelte Schlüssel in der es, was ist das problem?
- das problem ist, dass ich haben will, einen doppelten Schlüssel, aber immer noch einzigartige Schlüssel-Wert-Paaren (wenn ich einschränken, dass ein Teil).
Dictionary<Project, List<Technicians>>
gut genug aussieht. Aber wenn Sie nicht wirklich brauchen, um habenProject
als Schlüssel (D. H., die Sie nicht brauchen, um alle Techniker von einem Projekt), als Sie versuchenList<Tuple<Project, Technician>>
- Sie müssen in der Lage sein, effizient zu schauen, eine Gruppe von Ihrem Schlüssel (d.h. Projekt)? Wenn dem so ist,
Dictionary
ist Ihr Mann. Wenn man nicht aufpasst, dann benutzen Sie etwas anderes. - Ich muss alle Techniker für jedes Projekt, aber versuchen zu vermeiden, den zwei-dimensionalen Zugang, wenn ich könnte, aber ich glaube, dass Ihre erste option ist der Weg zu gehen.
- Wenn Sie nur jemals brauchen, um eine Liste der Techniker für ein Projekt, dann haben Sie eine Lösung. Wenn Sie brauchen, um zu gehen, vom Techniker bis zum Projekt, dann sollten Sie Blick auf dieses stackoverflow.com/questions/255341/...
- Halten Sie im Verstand, mit dem Sie Ihre gewünschte Lösung, werden Sie am Ende dabei mehrere updates/löschen in Ihrer Sammlung, wenn Sie eine änderung
Project
. Ihre aktuelle optionDictionary<Project, List<Technicians>>
dieses problem nicht hat und IMO, es ist gut genug. - möglich, Duplikat der mehrere Werte für Einen Schlüssel-Werte-dictionary in C#?
- Diese datastructure heißt eine multimap, leider gibt es das nicht in der .NET-Klassenbibliothek.
- Es ist wohl klar, dass Sie jetzt durch, aber was Sie beschreiben, ist mehr allgemein gedacht, weil mehrere Werte pro Schlüssel. Technisch gleiche, was ich vermute, aber, zumindest für mein Ohr, sprechen über "duplicate keys" klingt nach hinten, mehr wie ein Fehler oder ungültigen Zustand.
- Ich Stimme zu, und was Sie beschreiben, ist genau, wie ich mich fühlte vor, um diese Frage zu stellen. Ich verstehe jetzt viel besser.
Du musst angemeldet sein, um einen Kommentar abzugeben.
In deinem Fall, die gleichen Schlüssel bezieht sich auf mehrere Werte, so standard-Wörterbuch nicht geeignet ist, wie Sie ist. Sie können erklären, wie es
Dictionary<Key, List<Values>>
.Aber, auch, die Sie verwenden können:
Lookup Klasse, die
Müssen Sie framework 3.5 und mehr, für diese.
Lookup
haben einen öffentlichen Konstruktor?ToLookup
Erweiterung.Project
Klasse.Lookup
ist eine readonly-Kollektion, die nur erstellt werden, mithilfe von LINQ aus den vorhandenen Daten. Sie kann nicht instanziiert werden, es selbst, oder mutieren Sie.Project
Klasse ist nicht die bevorzugte route. Ich bin den Umgang mit software, die bereits geschrieben wurden und dieser beinhaltet einige Funktionen Hinzugefügt. Wir erst vor kurzem begann die Aufnahme Techniker Arbeitsstunden für ein bestimmtes Projekt. @Tigran, ist dieses ähnlich wie zu einemList<Tuple<>>
dass andere vorgeschlagen haben?Project
Klasse ist bevorzugen, da Sie eindeutig ein Projekt verbunden, um eine Liste der Techniker. Ich kann sehen, mit Hilfe einer Lookup-Klasse oder ein Wörterbuch, wenn Sie nicht ändern können, den source-code für das Projekt Klasse, aber wenn Sie können, es ist nützlich, um eine klare Verbindung zwischen zwei Klassen.Lookup
.List<Tuple>
Sie keinen key haben mag, Zugang zu ihm haben.Lookup
wird auf jeden Fall verwendet in Zukunft für mich und ich bin froh, dass Sie brachte es auf meine Aufmerksamkeit. Danke!Project
Klasse, aber Sie bekommen es von einem Dritten? In Fällen wie diesem, finde ichConditionalWeakTable
nützlich. Sie können dieProject
- Objekte als Schlüssel, aber Sie nicht haben, um über sorgen verursachen Speicherverluste.Was Sie brauchen, ist eine Beziehung zwischen einer
Project
und einen oder mehrere Techniker:Ihre Objekte spiegeln die Beziehungen im realen Leben.
Als seitliche Anmerkung, die Sie interessieren könnten Lesen über Domain-driven design.
Project
hat eine Liste der Techniker.Project
, und Sie müssen alle von derTechnicians
es dann in diesem Beispiel alles, was Sie tun müssen, ist nennen Sie eine Eigenschaft desProject
eher als die Einspeisung in das Wörterbuch und die Handhabung der Ausgabe. Es wird einfacher und schneller.Es ist eine experimentelle NuGet-Paket von MS enthält
MultiValueDictionary
.Im Grunde ist es wie
Dictionary<Project, List<Technicians>>
, außer dass Sie nicht haben, zu wiederholen, um die Logik zu verwalten, dieList
s jedes mal, wenn Sie darauf zugreifen.Ich glaube nicht, dass es etwas falsch mit Ihrer Lösung. Nachdem alle durch, die Sie zugreifen können leicht alle team-Mitglieder von project. Aber alternativ können Sie auch versuchen
List<KeyValuePair<Project, Technician>>
. Sie halten die Schlüssel-Wert-Beziehung, aber ohne Einschränkung, keine wiederholte Schlüssel. Ist es viel einfacher, was Sie jetzt haben? Hängt von use-cases.Alternativ können Sie verstecken diese Struktur, die hinter Ihrer benutzerdefinierten collection Implementierung.
HashSet<KeyValuePair<Project, Technician>>
?KeyValuePair
überschreibtEquals
, aber es scheint, dass es eigentlich gar nicht. Ich denke, dannTuple
kann eine bessere option sein (noch mitHashSet
).Habe ich die Kopie eingefügt, meine Antwort von dieser Beitrag.
Es ist leicht genug, um "roll your own" - version ein Wörterbuch, das ermöglicht "duplicate key" - Einträge. Hier eine grobe einfache Umsetzung. Möchten Sie vielleicht zu prüfen, hinzufügen von Unterstützung für die im Grunde die meisten (wenn nicht alle)
IDictionary<T>
.Einen schnellen Beispiel, wie man es benutzt: