Pass Dictionary KeyCollection, поддерживающая скорость доступа - PullRequest
2 голосов
/ 11 января 2012

У меня есть класс, который использует только keyCollection из Dictionary<long, object>, и я хотел бы передать другому классу только ключи.

Я знаю, что словарь имеет теоретический O(1) доступ по индексу (как HashTable), но если я преобразую набор ключей в список, доступ изменится на O(n).

Как я могу передать keyCollection моему классу, поддерживающему доступ O(1)?

РЕДАКТИРОВАТЬ : Я использую .NET 2.0.

Заранее спасибо.

1 Ответ

6 голосов
/ 11 января 2012

В комментарии вы упоминаете, что ваше намерение здесь .Contains(). В этом случае вы ищете HashSet<T>, который делает именно это - он просто хранит ключи (без значений) и предоставляет быстрые Contains проверки. Так; для вашего Dictionary<long,object> вы можете сделать что-то вроде:

var set = new HashSet<long>(dictionary.Keys);

и передайте это. Для удобства HashSet<T> реализует ICollection<T> (если вы хотите охватить его интерфейсом, а не конкретным типом) - здесь также есть Contains.

На самом деле, это может быть более эффективно для использования (что также работает в .NET 2.0):

ICollection<long> = dictionary.Keys;

и передайте это; реализация Contains(key) для этого есть O (1), так как она реализуется через:

bool ICollection<TKey>.Contains(TKey item)
{
    return this.dictionary.ContainsKey(item);
}
...