Para quê procurar?
a MSDN explica procurar Assim:
Não acho essa explicação particularmente útil. Para que é utilizado o Lookup?A
Lookup<TKey, TElement>
assemelha-se aDictionary<TKey, TValue>
. A diferença é que dicionáriomapeia chaves para valores únicos, enquanto que a procurar mapeia as chaves das colecções de valores.
5 answers
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.)
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());
}
}
}
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.
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
.
Lookup
a partir do Dictionary
cada vez que este último muda. Mas para alguns dados pode ser a solução certa.]
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.
Uma pesquisa irá mapear para potencialmente vários valores.
[[[1]}a pesquisa ["Smith"] ["John"] será uma coleção de tamanho 1 bilhão.