2009-11-20 3 views

Antwort

9

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:

2

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).

+1

Wenn Sie die Eigenschaft des Objekts nach dem Hinzufügen festlegen, wird es nicht mehr mit dem Schlüssel in der Sammlung synchronisiert. – Jeremy

4

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 von Collection<T> geerbt und wird durch Iterieren der Auflistung implementiert. Dies kann daher viel langsamer als Contains(TKey key) sein. Es ist zu einfach für Entwickler die Fehler mit der falschen Überlastung zu machen, so kann es Ihre eigene Contains(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.

+0

+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

Verwandte Themen