Autor |
Beitrag |
Palladin007
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: Mi 25.12.13 17:01
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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Palladin007 
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: Mi 25.12.13 17:17
Stimmt, das hab ich gar nicht gesehen, danke
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
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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 
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: 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
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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 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 
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: 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
PS: Danke für die Hilfe ^^
|
|
|