Entwickler-Ecke

Basistechnologien - Dictionary - Key ist im Value eingebettet


Palladin007 - Mi 25.12.13 17:01
Titel: Dictionary - Key ist im Value eingebettet
Moin,

ich suche eine IDictionary-Implementierung, wo der Schlüssel im Wert selber eingebettet liegt.

Selber implementierung ist nicht weiter schwer, aber ich hab vor ein paar Tagen mal etwas derartiges gelesen, das auch im .NET zuhause ist. Ich würde da gerne eine Microsoft-Implementierung verwenden, als es selber zu machen.


Hintergrund ist Folgender:

Ich möchte einige Objekte, die einen eindeutigen und readonly Namen beinhalten, anhand des Namens aus einer Liste abrufen.
Eine Variante wäre, dass ich die Liste immer mit LINQ durchlaufe, das klingt für mich aber eher unpraktisch, daher der Gedanke, dass der Name als Key in einem Dictionary liegt. Würde aber bedeuten, dass ich den Namen immer doppelt habe.

Daher der Gedanke, dass das der Key im Value selber liegt.



Ich hab eben auch die abstrakte Klasse KeyedCollection gefunden, aber keine passende Implemetierung dazu.



Gruß



PS:

Gibt es eigentlich irgendwo eine Liste der vielen verschiedenen Varianten des Dictionarys?
Ich ewische mich immer wieder, wo ich eine Dictionary verschachtel, wo es vielleicht ja bereits ein fertiges Dictioary gibt, was ähnliche Funktionen bereit stellt.


Christian S. - Mi 25.12.13 17:08

Moin!

Eine passende Implementierung der KeyedCollection kannst doch auch nur Du machen, denn nur Du weißt ja, wie Deine Items aussehen. Und wenn ich das richtig sehe, ist da nur noch die GetKeyForItem-Methode abstrakt, alles andere ist fertig. Die Implementierung sollte daher super-schnell gehen.

Grüße
Christian


Palladin007 - Mi 25.12.13 17:17

Stimmt, das hab ich gar nicht gesehen, danke :D



PS:

Eine allgemeine Implementierung wäre z.B. mit einem Konstruktor, der eine Function entgegen nimmt, die dann die Aufgabe von GetKeyForItem übernimmt. SO hätte ich das gelöst. ^^


Ralf Jansen - Mi 25.12.13 17:24

Die KeyedCollection benutzt intern einfach ein Dictionary. Den Key den du GetKeyForItem Methode bestimmst wird eben als Key für das interen Dictionary verwendet. Den Key gibt es also weiterhin ~doppelt~. Als Hash vom Key und in deinem Object. Ich würde denke ich weiterhin einfach Dictionary verwenden. KeyedCollection sieht für mich zu banal aus um es in seinem persönlichen Toolset auf Abruf zu haben. Da gehört wichtigeres rein ;)


Palladin007 - Do 26.12.13 13:02

Ich hätte es auch nur in mein persönliches Tool-Set gepackt, wenn ich es selber neu geschrieben hätte ^^


Mal so nebenbei:

Wenn ich diese KeyedCollection jetzt selber umsetze und dann halt bei jedem Add den Key direkt aus dem Value raus ziehe, gibt es dann noch irgendwelche Vorteile von der KeyedCollection, irgendwelche Optimierungen, etc.?


Und noch ne Frage:

Gibts das ganze auch ohne eindeutigen Key, wo dann halt über den Key alle Values abgerufen werden, die diesen Key mit bringen?


Ralf Jansen - Do 26.12.13 13:47

Zitat:
Wenn ich diese KeyedCollection jetzt selber umsetze und dann halt bei jedem Add den Key direkt aus dem Value raus ziehe, gibt es dann noch irgendwelche Vorteile von der KeyedCollection, irgendwelche Optimierungen, etc.?


Keinerlei Magie erkennbar. Ich würde sagen nein.

Zitat:
Gibts das ganze auch ohne eindeutigen Key, wo dann halt über den Key alle Values abgerufen werden, die diesen Key mit bringen?


Indirekt wenn du schon eine andere Liste hast über die Linq Methode ToLookup(). Eine Lookup [http://msdn.microsoft.com/de-de/library/bb460184.aspx] Klasse darf man leider nicht direkt erzeugen. Das bekommt man auch wenn man im Linq Syntax gruppiert.

Sonst


C#-Quelltext
1:
Dictionary<KeyType, List<ValueType>>                    


oder


C#-Quelltext
1:
List<Tuple<KeyType, ValueType>>                    


Ich würde 2.ten vorziehen da lässt sich vermutlich leichter mit LINQ arbeiten. Wenns um die Geschwindigkeit des Zugriffs über den Key geht dann lieber das Dictionary.


Palladin007 - Do 26.12.13 14:38

Und da hab ich wieder unschöne Verschachtelungen, die ich eigentlich vermeiden wollte.

Aber gut, wenn es das nicht gibt, dann werd ich das wohl machen müssen, für eine extra Klasse, die das macht und dann in meiner Sammlung landet, ist das ein bisschen zu mikrig :D



PS: Danke für die Hilfe ^^