Я ищу способ, который был бы столь же эффективен, как и свойство Keys (типа KeyCollection) универсального словаря.
Использование оператора SELECT в Linq будет работать, но оно будет повторяться по всей коллекции каждыйвремя, когда ключи запрашиваются, хотя я считаю, что ключи уже могут храниться внутри.
В настоящее время мой класс GenericKeyedCollection выглядит следующим образом:
public class GenericKeyedCollection<TKey, TItem> : KeyedCollection<TKey, TItem> {
private Func<TItem, TKey> getKeyFunc;
protected override TKey GetKeyForItem(TItem item) {
return getKeyFunc(item);
}
public GenericKeyedCollection(Func<TItem, TKey> getKeyFunc) {
this.getKeyFunc = getKeyFunc;
}
public List<TKey> Keys {
get {
return this.Select(i => this.GetKeyForItem(i)).ToList();
}
}
}
Обновление: Благодаряваши ответы, поэтому я буду использовать следующее свойство вместо итерации с Linq.
public ICollection<TKey> Keys {
get {
if (this.Dictionary != null) {
return this.Dictionary.Keys;
}
else {
return new Collection<TKey>(this.Select(this.GetKeyForItem).ToArray());
}
}
}