2011-03-25 15 views

Respuesta

89

ILookup entradas pueden contener varios elementos, por tecla - cada tecla está asignada a una IEnumerable<TElement>.

También como se insinuó en los comentarios de un ILookup es inmutable, mientras que se puede actualizar los valores de una IDictionary (que expone un método Add() y un indexador que permite conseguir y valores de ajuste).

En resumen, su caso de uso es muy diferente: utiliza una búsqueda cuando necesita un mapa 1: N con valores corregidos que no cambian (y no pueden). Un diccionario por otro lado ofrece una mutable mapeo 1: 1 de pares de valores clave, por lo que se puede actualizar para agregar o eliminar valores.

+1

De hecho, cada entrada es un 'IEnumerable ' en lugar de una 'T'. – Gabe

+1

+1 Si bien es cierto, sería bueno tener más sobre la diferencia con la interfaz, la mutabilidad de actualización, los requisitos clave, etc. –

+0

Implementar 'ILookup ' no es garantía de inmutabilidad. Tu respuesta parece implicar que sí lo es. Simplemente proporciona una * vista * de solo lectura de una búsqueda. Además, cómo un método que acepte un 'ILookup ' podría manejar el cambio de contenido de la búsqueda depende de ese método, y si no hay documentación, es más seguro evitar la mutación de una búsqueda mientras el código extranjero todavía hace referencia y dependiendo de su caso de uso . Vea toda la discusión sobre cómo las personas piensan erróneamente que la implementación de 'IReadOnlyList ' debería implicar que una lista es inmutable. – binki

2

Es mucho más simple que IDictionary. Es utilizado por Linq. Solo tiene Contains, Item y Count. IDictionary tiene Add, Remove, etc.

+0

¿Quiere decir que ILookup es un subconjunto de solo lectura de IDictionary? –

+1

Tipo de ... Pero cada elemento es un agrupamiento IG, por lo que puede haber múltiples elementos para una tecla, por lo que no se correlaciona bien. Hubiera sido agradable tener una interfaz de solo lectura para Dictionary. – Philippe

+2

@Philippe La interfaz de solo lectura del diccionario es 'IReadOnlyDictionary ' y todas las instancias de la clase 'Dictionary ' lo implementan ('ToDictionary' devuelve la instancia de la clase, por lo que también funciona), para que pueda exponer cualquier diccionario como de solo lectura. –