Я пытаюсь обернуть голову, какие структуры данных являются наиболее эффективными и когда и где использовать какие.
Возможно, я просто недостаточно хорошо понимаю структуры, но как это ILookup(of key, ...)
отличается от Dictionary(of key, list(of ...))
?
Кроме того, где я хотел бы использовать ILookup
и где это было бы более эффективно с точки зрения скорости программы / памяти / доступа к данным и т. Д.?
Ответы:
Два существенных различия:
Lookup
неизменен. Ууу :) (По крайней мере, я считаю, что конкретныйLookup
класс неизменен, иILookup
интерфейс не предоставляет никаких мутирующих членов. Конечно, могут быть и другие изменяемые реализации.)KeyNotFoundException
. (Следовательно, нетTryGetValue
, AFAICR.)Они, вероятно, будут эквивалентны по эффективности - поиск может вполне использовать
Dictionary<TKey, GroupingImplementation<TValue>>
закулисную, например. Выберите между ними в зависимости от ваших требований. Лично я нахожу, что поиск обычно лучше подходит, чемDictionary<TKey, List<TValue>>
, в основном из-за первых двух пунктов выше.Обратите внимание, что в качестве детали реализации, конкретная реализация
IGrouping<,>
которой используется для значений реализуетIList<TValue>
, что означает, что его эффективно использовать сCount()
,ElementAt()
и т. Д.источник
Интересно, что никто не указал фактическую самую большую разницу (взято непосредственно из MSDN ):
источник
И a,
Dictionary<Key, List<Value>>
иLookup<Key, Value>
логически могут содержать данные, организованные одинаковым образом, и оба имеют одинаковый порядок эффективности. Основным отличием является то, что aLookup
является неизменным: у него нетAdd()
методов и открытого конструктора (и, как упоминал Джон, вы можете запросить несуществующий ключ без исключения и иметь ключ как часть группировки).Что касается того, что вы используете, это действительно зависит от того, как вы хотите их использовать. Если вы поддерживаете карту ключей с несколькими значениями, которая постоянно изменяется, то,
Dictionary<Key, List<Value>>
вероятно, лучше, поскольку она изменчива.Если, однако, у вас есть последовательность данных и вы просто хотите просматривать данные только для чтения, организованные по ключу, тогда поиск очень прост в создании и даст вам снимок только для чтения.
источник
Основное различие между an
ILookup<K,V>
и a вDictionary<K, List<V>>
том, что словарь изменчив; Вы можете добавлять или удалять ключи, а также добавлять или удалять элементы из списка, который ищется. AnILookup
является неизменным и не может быть изменен после создания.Базовая реализация обоих механизмов будет одинаковой или похожей, поэтому их скорость поиска и объем памяти будут примерно одинаковыми.
источник
Еще одно различие, которое еще не упоминалось, заключается в том, что Lookup () поддерживает нулевые ключи :
источник
Когда исключение не является опцией, перейти к поиску
Если вы пытаетесь получить структуру, столь же эффективную, как,
Dictionary
но не знаете наверняка, что во вводе нет повторяющегося ключа,Lookup
это безопаснее.Как уже упоминалось в другом ответе, он также поддерживает нулевые ключи и всегда возвращает действительный результат при запросе к произвольным данным, поэтому он выглядит более устойчивым к неизвестному вводу (менее склонен, чем словарь, вызывать исключения).
И это особенно верно, если вы сравните это с
System.Linq.Enumerable.ToDictionary
функцией:Альтернативой может быть написание собственного дублирующего кода управления ключами внутри
foreach
цикла.Производительность, словарь: явный победитель
Если вам не нужен список, и вы собираетесь управлять огромным количеством элементов
Dictionary
(или даже собственной настраиваемой структурой), это будет более эффективным:Так как
Lookup
приходится вести список элементов для каждого ключа, он медленнее словаря (примерно в 3 раза медленнее для огромного количества элементов)источник