Czy istnieje ogólna konkretna implementacja KeyedCollection?

TheSystem.Collections.ObjectModel.KeyedCollection klasa jest bardzo przydatną alternatywą dlaSystem.Collections.Generic.Dictionary, zwłaszcza gdy kluczowe dane są częścią przechowywanego obiektu lub chcesz móc wyliczyć elementy w porządku. Niestety klasa jest abstrakcyjna i nie mogę znaleźć ogólnej konkretnej implementacji w podstawowej strukturze .NET.

TheWytyczne dotyczące projektowania ram książka wskazuje, że konkretna realizacjapowinien należy podać dla typów abstrakcyjnych (sekcja 4.4 Streszczenie klasy). Dlaczego projektanci ram mieliby pominąć ogólną konkretną implementację tak użytecznej klasy, zwłaszcza, gdy można ją uzyskać, po prostu ujawniając konstruktora, który akceptuje i przechowujePrzetwornik od elementu do jego klucza:

public class ConcreteKeyedCollection<TKey, TItem> : KeyedCollection<TKey, TItem>
{
    private Converter<TItem, TKey> getKeyForItem = null;
    public ConcreteKeyedCollection(Converter<TItem, TKey> getKeyForItem)
    {
        if (getKeyForItem == null) { throw new ArgumentNullException("getKeyForItem"); }
        this.getKeyForItem = getKeyForItem;
    }
    protected override TKey GetKeyForItem(TItem item)
    {
        return this.getKeyForItem(item);
    }
}

questionAnswers(4)

yourAnswerToTheQuestion