Anstelle von Dictionary<TKey,TValue>
möchte ich irgendeine Art von Sammlungsklasse, die eine Eigenschaft des Werts als Schlüssel verwenden kann, gibt es so etwas?Gibt es eine wörterbuchähnliche Auflistung, die eine Eigenschaft ihres Werts als Schlüssel verwenden kann?
Antwort
Ja, gibt es - System.Collections.ObjectModel.KeyedCollection<TKey, TValue>
.
Das ist abstrakt, und es gibt keine konkreten abgeleiteten Klassen im Rahmen, soweit ich sehen kann, aber alles, was Sie implementieren müssen, ist GetKeyForItem
, soweit ich sehen kann. Beispielsweise könnten Sie dies mit einem Delegaten tun:
eine normale verwenden, und wenn Sie den Schlüssel Wertpaar festgelegt, geben Sie die Eigenschaft des Wertes Sie interessiert sind.
Das war zu einfach, ich muss Ihr Antrag sein Mißverständnis.
Vielleicht wollten Sie später eine beliebige Eigenschaft anstelle der Eingabe verwenden. In diesem Fall denke ich, dass Sie mehrere Wörterbuchobjekte verwenden müssen (vielleicht in einer Hilfsklasse zusammengebunden).
KeyedCollection wie Jon Skeet sagt, ist der offensichtliche Kandidat.
Ein paar zufälligen Bemerkungen über diese Klasse:
Sie wollen natürlich die Eigenschaft, dass Sie als Schlüssel verwenden, nur lesbar zu sein.
Die Methode
Contains(TItem item)
ist vonCollection<T>
geerbt und wird durch Iterieren der Auflistung implementiert. Dies kann daher viel langsamer alsContains(TKey key)
sein. Es ist zu einfach für Entwickler die Fehler mit der falschen Überlastung zu machen, so kann es Ihre eigeneContains(TItem item)
Methode unter Berücksichtigung der Umsetzung wert sein:public new bool Contains(TItem item) { if (item == null) throw new ArgumentNullException("item"); return this.Contains(GetKeyForItem(item)); }
Im Gegensatz zu einem IDictionary, es kein Verfahren
TryGetValue
hat. Dies kann nützlich sein, und es könnte sich lohnen Umsetzung Ihrer eigenen:public bool TryGetValue(TKey key, out TItem item) { // If the dictionary exists, use it if (Dictionary != null) return Dictionary.TryGetValue(key, out item); // Else do it the hard way if (!this.Contains(key)) { item = default(TItem); return false; } item = this[key]; return true; }
Es ist nicht Aufzählung der Schlüssel nicht unterstützt, die nützlich sein können:
public IEnumerable<TKey> GetKeys() { foreach (TItem item in this) { yield return GetKeyForItem(item); } }
Serialisierung ineffizient sein kann, wie es wird sowohl seine interne Liste als auch sein internes Wörterbuch serialisieren. Sie können dies umgehen, wenn Sie benutzerdefinierte Serialisierung implementieren müssen.
+1, so hätte Keyed Collection implementiert werden sollen. Zwei Vorschläge, ich würde es 'TryGetItem' nennen und' GetKeys' zu einer Eigenschaft wie 'Keys' machen. – nawfal
- 1. Kann ich XAML verwenden, um eine verschachtelte Eigenschaft (Eigenschaft des Werts einer Eigenschaft) eines Steuerelements festzulegen?
- 2. Gibt es eine CSS-Min-Top-Eigenschaft
- 3. Gibt es eine Datenbank, die Regex als Werte speichern kann?
- 4. Kann ich eine generische Auflistung in einer abstrakten Basisklasseneigenschaft verwenden?
- 5. eine Variable als Schlüssel auf JSON verwenden
- 6. Kann ich eine Liste von Objekten als Dictionary-Schlüssel verwenden?
- 7. Gibt es in WPF eine DesignMode-Eigenschaft?
- 8. Gibt es eine Möglichkeit, eine Eigenschaft nur einmal in C#
- 9. Redis: Gibt es eine Grenze für die Anzahl der Schlüssel, die ich speichern kann?
- 10. eine Eigenschaft, die eine andere Eigenschaft beobachtet?
- 11. Gibt es eine Tabelle, die die Auflistung von sysobjects.xtype-Beschreibungen enthält?
- 12. Gibt es eine Möglichkeit, eine Spaltenüberschrift in einer Datenbank als eine Variable in Python zu verwenden?
- 13. Probleme mit einer Aufzählung als Schlüssel in einer Dictionary-Auflistung
- 14. Gibt es eine Möglichkeit, Build-Status als eine Eigenschaft zu erhalten?
- 15. Gibt es in .NET eine serialisierbare generische Schlüssel/Wert-Paarklasse?
- 16. Bedingte Änderung der Bildquelle anhand ihres ID-Werts
- 17. Gibt es eine Möglichkeit, TabControl.Items.CurrentChanging abzubrechen?
- 18. Gibt es eine bessere IDOMImplementation als MSXML?
- 19. Gibt es eine integrierte Methode zum binären Durchsuchen der Einträge in der Auflistung von .NET EventLog.Entries?
- 20. Gibt es eine umgekehrte "setValuesForKeysWithDictionary" - eine makeDictionaryWithObjectProperties?
- 21. Kann ich eine enum als eine Eigenschaft in Objective C verwenden
- 22. Gibt es eine Auflistung von Listen, die gleichzeitige Änderungen während der Iteration unterstützen?
- 23. Gibt es eine schnelle In-Memory-Warteschlange, die ich verwenden kann, die Elemente wechselt, wie es eine bestimmte Größe erreicht?
- 24. Gibt es eine Scala-Bibliothek, die Tupel als Monade behandelt?
- 25. Erbt eine Oracle-Prozedur die Berechtigungen ihres Erstellers?
- 26. Gibt es eine Möglichkeit, Eigenschaft Setters unter Triggern
- 27. Übergabe des Werts des Eingabeelements als Parameter an eine Viewmodel-Funktion
- 28. Gibt es eine Möglichkeit, eine zugeordnete Abfrage als Zeile anzuzeigen?
- 29. Gibt es eine Möglichkeit, mehrere Hash-Schlüssel in DynamoDB abzufragen?
- 30. Gibt es eine PowerShell Get-Childitem-Timeout-Eigenschaft?
Wenn Sie die Eigenschaft des Objekts nach dem Hinzufügen festlegen, wird es nicht mehr mit dem Schlüssel in der Sammlung synchronisiert. – Jeremy