Pregunta

El MSDN explica la búsqueda de esta manera:

  

A Búsqueda < TKey, TElement >   se asemeja a un Diccionario < TKey,   TValue > . La diferencia es que un    Dictionary < TKey, TValue > asigna claves a valores individuales, mientras que    Lookup < TKey, TElement > asigna claves a colecciones de valores.

No encuentro esa explicación particularmente útil. ¿Para qué se utiliza la búsqueda?

¿Fue útil?

Solución

Es un cruce entre un IGrouping y un diccionario. Le permite agrupar los elementos por una clave, pero luego acceder a ellos a través de esa clave de una manera eficiente (en lugar de simplemente iterarlos sobre todos, que es lo que GroupBy le permite hacer).

Por ejemplo, podría tomar una carga de tipos .NET y crear una búsqueda por espacio de nombres ... luego acceder a todos los tipos en un espacio de nombres en particular muy fácilmente:

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);
        }
    }
}

(Normalmente usaría var para la mayoría de estas declaraciones, en código normal).

Otros consejos

Una forma de pensar en esto es: Lookup < TKey, TElement > es similar a Dictionary < TKey, Collection < TElement > > . Básicamente, se puede devolver una lista de cero o más elementos a través de la misma clave.

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()); // 1
            Console.WriteLine("S's: {0}", namesByInitial['S'].Count()); // 2
            Console.WriteLine("Z's: {0}", namesByInitial['Z'].Count()); // 0, does not throw
        }
    }
}

Un uso de Lookup podría ser revertir un Diccionario .

Supongamos que tiene una guía telefónica implementada como un Diccionario con varios nombres (únicos) como claves, cada nombre asociado con un número de teléfono. Pero dos personas con nombres diferentes pueden compartir el mismo número de teléfono. Esto no es un problema para un Dictionary , que no importa que dos claves correspondan al mismo valor.

Ahora desea una forma de consultar a quién pertenece un número de teléfono determinado. Construye una Lookup , agregando todos los KeyValuePairs de su Dictionary , pero al revés, con el valor como clave y la clave como valor. Ahora puede consultar un número de teléfono y obtener una lista de nombres de todas las personas cuyo número de teléfono es. Crear un Diccionario con los mismos datos eliminaría los datos (o fallaría, dependiendo de cómo lo hiciste), ya que hacerlo

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

significa que la segunda entrada sobrescribe la primera: el documento ya no aparece en la lista.

Intentando escribir los mismos datos de una manera ligeramente diferente:

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

lanzaría una excepción en la segunda línea ya que no puede Agregar una clave que ya está en el Diccionario .

[Por supuesto, es posible que desee utilizar alguna otra estructura de datos única para realizar búsquedas en ambas direcciones, etc. Este ejemplo significa que tiene que volver a generar el Lookup del Dictionary cada vez que este último cambia. Pero para algunos datos podría ser la solución correcta.]

No lo he usado con éxito antes, pero aquí está mi página:

Una búsqueda < TKey, TElement > se comportaría de manera muy parecida a un índice de base de datos (relacional) en una tabla sin una restricción única. Úsalo en los mismos lugares donde usarías el otro.

Supongo que podría argumentarlo de esta manera: imagine que está creando una estructura de datos para contener el contenido de una guía telefónica. Desea escribir por apellido y luego por nombre. Usar un diccionario aquí sería peligroso porque muchas personas pueden tener el mismo nombre. Por lo tanto, un Diccionario siempre, como máximo, se asignará a un solo valor.

Una búsqueda se asignará potencialmente a varios valores.

La búsqueda [" Smith "] [" John "] será una colección de un tamaño de mil millones.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top