Класс System.Collections.ObjectModel.KeyedCollection является очень полезной альтернативой System.Collections.Generic.Dictionary, особенно когда ключевые данные являются частью объекта, который хранится, или вы хотите иметь возможность перечислять элементы в порядке. К сожалению, класс является абстрактным, и я не могу найти общую конкретную реализацию в основной платформе .NET.
Руководство по дизайну каркаса указывает, что конкретная реализация должна быть предоставлена для абстрактных типов (раздел 4.4. Дизайн абстрактного класса). Почему разработчики фреймворка не учитывают общую конкретную реализацию такого полезного класса, особенно когда это может быть обеспечено просто разоблачением конструктора, который принимает и сохраняет Converter от элемента к его ключу:
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);
}
}