Какова точка поиска ?

MSDN объясняет поиск следующим образом:

Lookup напоминает Dictionary . Разница заключается в том, что словарь сопоставляет ключи с одиночными значениями, тогда как Lookup сопоставляет ключи с наборами значений.

Я не считаю это объяснение особенно полезным. Для чего используется Lookup?

    Это перекресток между IGrouping и словарем. Он позволяет группировать элементы вместе с помощью ключа, но затем эффективно использовать их через этот ключ (а не просто перебирать их все, что позволяет GroupBy ).

    Например, вы можете взять нагрузку на типы .NET и построить поиск по пространству имен … затем очень легко перейти ко всем типам в определенном пространстве имен:

     using System; using System.Collections.Generic; using System.Linq; using System.Xml; public class Test { static void Main() { // Just types covering some different assemblies Type[] sampleTypes = new[] { typeof(List<>), typeof(string), typeof(Enumerable), typeof(XmlReader) }; // All the types in those assemblies IEnumerable allTypes = sampleTypes.Select(t => t.Assembly) .SelectMany(a => a.GetTypes()); // Grouped by namespace, but indexable ILookup lookup = allTypes.ToLookup(t => t.Namespace); foreach (Type type in lookup["System"]) { Console.WriteLine("{0}: {1}", type.FullName, type.Assembly.GetName().Name); } } } 

    (Обычно я использую var для большинства этих объявлений в обычном коде).

    Один из способов подумать об этом: Lookup похож на Dictionary> . В принципе, список из нуля или более элементов может быть возвращен через один и тот же ключ.

     namespace LookupSample { using System; using System.Collections.Generic; using System.Linq; class Program { static void Main(string[] args) { List names = new List(); names.Add("Smith"); names.Add("Stevenson"); names.Add("Jones"); ILookup namesByInitial = names.ToLookup((n) => n[0]); // count the names Console.WriteLine("J's: {0}", namesByInitial['J'].Count()); Console.WriteLine("S's: {0}", namesByInitial['S'].Count()); Console.WriteLine("Z's: {0}", namesByInitial['Z'].Count()); } } } 

    Одно использование Lookup может заключаться в том, чтобы отменить Dictionary .

    Предположим, что у вас есть телефонная книга, реализованная в виде Dictionary с множеством (уникальных) имен в качестве ключей, каждое имя связано с номером телефона. Но два человека с разными именами могут иметь один и тот же номер телефона. Это не проблема для Dictionary , который не заботится о том, чтобы две клавиши соответствовали одному значению.

    Теперь вам нужен способ поиска, кому принадлежит данный номер телефона. Вы Lookup , добавляя все KeyValuePairs из своего Dictionary , но назад, со значением в качестве ключа и ключа в качестве значения. Теперь вы можете запросить номер телефона и получить список имен всех людей, у которых есть номер телефона. Построение Dictionary с теми же данными приведет к потере данных (или сбою, в зависимости от того, как вы это сделали), так как

     dictionary["555-6593"] = "Dr. Emmett Brown"; dictionary["555-6593"] = "Marty McFly"; 

    означает, что вторая запись перезаписывает первый – Doc больше не указан.

    Попытка написать одни и те же данные несколько иначе:

     dictionary.Add("555-6593", "Dr. Emmett Brown"); dictionary.Add("555-6593", "Marty McFly"); 

    будет вызывать исключение во второй строке, так как вы не можете Add ключ, который уже находится в Dictionary .

    [Конечно, вы можете использовать какую-то другую единую структуру данных для поиска в обоих направлениях и т. Д. Этот пример означает, что вам нужно регенерировать поиск из Dictionary каждый раз, когда последний изменяется. Но для некоторых данных это может быть правильным решением.]

    Я не использовал его раньше, но вот мой ход:

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

    Думаю, вы могли бы так утверждать: представьте, что вы создаете структуру данных для хранения содержимого телефонной книги. Вы хотите использовать ключ lastName, а затем firstName. Использование словаря здесь было бы опасно, потому что многие люди могут иметь одно и то же имя. Таким образом, словарь всегда будет, в лучшем случае, сопоставляться с одним значением.

    Поиск будет отображать потенциально несколько значений.

    Lookup [«Смит»] [«Джон»] будет представлять собой коллекцию размером один миллиард.

    Давайте будем гением компьютера.