Para quê procurar?

a MSDN explica procurar Assim:

A Lookup<TKey, TElement> assemelha-se a Dictionary<TKey, TValue>. A diferença é que dicionário mapeia chaves para valores únicos, enquanto que a procurar mapeia as chaves das colecções de valores.

Não acho essa explicação particularmente útil. Para que é utilizado o Lookup?

5 answers

É uma cruz entre um dicionário e um dicionário. Permite agrupar itens por uma chave, mas então acessá-los através dessa chave de forma eficiente (em vez de apenas iterar sobre todos eles, que é o que GroupBy permite que você faça).

Por exemplo, você poderia pegar uma carga de tipos.NET e construir uma pesquisa pelo espaço de nomes... em seguida, chegar a todos os tipos em um determinado espaço de nomes muito facilmente:

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<Type> allTypes = sampleTypes.Select(t => t.Assembly)
                                               .SelectMany(a => a.GetTypes());

        // Grouped by namespace, but indexable
        ILookup<string, Type> lookup = allTypes.ToLookup(t => t.Namespace);

        foreach (Type type in lookup["System"])
        {
            Console.WriteLine("{0}: {1}", 
                              type.FullName, type.Assembly.GetName().Name);
        }
    }
}

(eu normalmente usaria var para a maioria destas declarações, em código normal.)

 185
Author: Jon Skeet, 2013-03-31 14:32:07

Uma maneira de pensar é esta: Lookup<TKey, TElement> é semelhante a Dictionary<TKey, Collection<TElement>>. Basicamente, uma lista de zero ou mais elementos podem ser devolvidos através da mesma chave.

namespace LookupSample
{
    using System;
    using System.Collections.Generic;
    using System.Linq;

    class Program
    {
        static void Main(string[] args)
        {
            List<string> names = new List<string>();
            names.Add("Smith");
            names.Add("Stevenson");
            names.Add("Jones");

            ILookup<char, string> 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());
        }
    }
}
 54
Author: bobbymcr, 2009-09-10 05:48:21

Uma utilização de Lookup pode ser reverter a Dictionary.

Suponha que tem uma lista telefónica implementada como um Dictionary com um monte de nomes (únicos) como chaves, cada nome associado a um número de telefone. Mas duas pessoas com nomes diferentes podem partilhar o mesmo número de telefone. Isto não é um problema para um Dictionary, que não se importa que duas chaves correspondam ao mesmo valor.

Agora queres uma forma de descobrir a quem pertence um número de telefone. Você constrói um Lookup, adicionando todos os KeyValuePairs de seu Dictionary, mas para trás, com o valor como a chave e a chave como o valor. Você pode agora consultar um número de telefone, e obter uma lista de nomes de todas as pessoas cujo número de telefone que é. Construir um Dictionary com os mesmos dados iria baixar os dados( ou falhar, dependendo de como você fez isso), uma vez que fazer
dictionary["555-6593"] = "Dr. Emmett Brown";
dictionary["555-6593"] = "Marty McFly";

Significa que a segunda entrada sobrepõe a primeira - o Doc já não está listado.

Tentando escrever os mesmos dados de uma forma ligeiramente diferente:

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

Atirava uma exceção na segunda linha, uma vez que você não pode Add uma chave que já está em Dictionary.

[[15]} [claro, você pode querer usar alguma outra estrutura de dados únicos para fazer pesquisas em ambas as direções, etc. Este exemplo significa que você tem que regenerar o Lookup a partir do Dictionary cada vez que este último muda. Mas para alguns dados pode ser a solução certa.]
 18
Author: jwg, 2014-06-08 22:38:51

Ainda não o usei com sucesso antes, mas aqui está a minha jogada:

Um Lookup<TKey, TElement> comportaria-se como um índice de base de dados (relacional) numa tabela sem uma restrição única. Use - o nos mesmos lugares que você usaria o outro.

 11
Author: Daren Thomas, 2009-09-10 05:24:22
Eu acho que você poderia argumentar desta maneira: imagine que você está criando uma estrutura de dados para manter o conteúdo de uma lista telefônica. Você quer chave por lastName e então pelo primeiro nome. Usar um dicionário aqui seria perigoso porque muitas pessoas podem ter o mesmo nome. Assim, Um Dicionário sempre, no máximo, mapeia para um único valor.

Uma pesquisa irá mapear para potencialmente vários valores.

[[[1]}a pesquisa ["Smith"] ["John"] será uma coleção de tamanho 1 bilhão.
 5
Author: David Andres, 2009-09-10 05:26:03