Каков наиболее эффективный способ получить список ключей из коллекции KeyedCollection? - PullRequest
3 голосов
/ 19 июля 2011

Я ищу способ, который был бы столь же эффективен, как и свойство 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());
            }
        }
    }

Ответы [ 2 ]

5 голосов
/ 19 июля 2011

Согласно документации , у класса есть свойство Словарь , поэтому вы можете сделать это:

var keys = collection.Dictionary.Keys;

Обратите внимание, что есть предупреждение,как описано в документации.Если вы создаете коллекцию с пороговым значением для словаря, словарь не будет заполняться до тех пор, пока в коллекцию не будет введено хотя бы столько значений.

Если это не так в вашей ситуации, т.е.словарь всегда хорош, вышеприведенный код должен помочь.

Если нет, то вам нужно либо изменить свою конструкцию, чтобы избежать установки этого порога, либо вам просто нужно будет зациклить и извлечь ключчерез метод GetKeyForItem .

2 голосов
/ 19 июля 2011

Не уверен, что это наиболее эффективно, но вы можете использовать свойство Dictionary, чтобы получить общее представление словаря, а затем использовать для этого свойство Keys, чтобы получить список ключей.

...