Подтвердить что ты не робот

Разница между Lookup() и словарем (из списка())

Я пытаюсь обернуть голову, какие структуры данных наиболее эффективны и когда/где их использовать.

Теперь, может быть, я просто недостаточно разбираюсь в структурах, но как отличается ILookup(of key, ...) от Dictionary(of key, list(of ...))?

Также, где бы я хотел использовать ILookup и где он был бы более эффективным с точки зрения скорости программы/памяти/доступа к данным и т.д.?

4b9b3361

Ответ 1

Две существенные отличия:

  • Lookup является неизменным. Yay:) (По крайней мере, я считаю, что конкретный класс Lookup неизменен, а интерфейс ILookup не содержит каких-либо мутирующих элементов. Конечно, могут быть и другие изменчивые реализации).
  • Когда вы просматриваете ключ, отсутствующий в поиске, вы получаете пустую последовательность назад вместо KeyNotFoundException. (Следовательно, нет TryGetValue, AFAICR.)

Они, вероятно, будут эквивалентны по эффективности - поиск может, например, использовать Dictionary<TKey, GroupingImplementation<TValue>> за кулисами. Выбирайте между ними, исходя из ваших требований. Лично я считаю, что поиск обычно лучше, чем Dictionary<TKey, List<TValue>>, в основном из-за первых двух точек выше.

Обратите внимание, что в качестве детали реализации конкретная реализация IGrouping<,>, которая используется для значений реализует IList<TValue>, что означает, что она эффективна для использования с Count(), ElementAt() и т.д.

Ответ 2

Оба a Dictionary<Key, List<Value>> и a Lookup<Key, Value> логически могут хранить данные, упорядоченные аналогичным образом, и оба имеют один и тот же порядок эффективности. Основное отличие: Lookup является неизменным: он не имеет методов Add() и не имеет открытого конструктора (и, как сказал Джон, вы можете запросить несуществующий ключ без исключения и иметь ключ как часть группировки).

Что вы используете, это действительно зависит от того, как вы хотите их использовать. Если вы поддерживаете карту ключа для нескольких значений, которые постоянно изменяются, то Dictionary<Key, List<Value>>, вероятно, лучше, поскольку он изменен.

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

Ответ 3

Интересно, что никто не заявил о самой большой разнице (взято непосредственно из MSDN):

Поиск похож на словарь. разница заключается в том, что словарь сопоставляет ключи с одиночными значения, тогда как Lookup сопоставляет ключи с коллекциями значения.

Ответ 4

Основное различие между ILookup<K,V> и a Dictionary<K, List<V>> заключается в том, что словарь изменчив; вы можете добавлять или удалять ключи, а также добавлять или удалять элементы из списка, который просматривается. ILookup является неизменным и не может быть изменен после создания.

Основная реализация обоих механизмов будет либо одинаковой, либо подобной, поэтому их скорость поиска и объем памяти будут примерно одинаковыми.

Ответ 5

Еще одно отличие, которое не упомянуто, заключается в том, что Lookup() поддерживает нулевые ключи:

Класс поиска реализует интерфейс ILookup. Поиск очень похож на словарь, за исключением того, что нескольким значениям разрешено сопоставлять один и тот же ключ, а нулевые ключи поддерживаются.