2011-10-27 54 views
13

Tengo una duda extraña relación con la lista y el diccionario en C#¿cuál es la diferencia entre la lista <> y el diccionario <> en C#

En una lista añadimos elementos de lista mediante el siguiente método

using System.Collections.Generic; 

class Program 
{ 
    static void Main() 
    { 
     List<int> list = new List<int>(); 
     list.Add(2); 
     list.Add(3); 
     list.Add(5); 
     list.Add(7); 
    } 
} 

en un diccionario le sumamos artículos como este ...

using System; 
using System.Collections.Generic; 

class Program 
{ 
    static void Main() 
    { 
     Dictionary<string, int> d = new Dictionary<string, int>(); 
     d.Add("cat", 2); 
     d.Add("dog", 1); 
     d.Add("llama", 0); 
     d.Add("iguana", -1); 
    } 
} 

no sé exactamente cuál es la diferencia, pero en un diccionario que añadir elementos, como un (clave, valor) y el par en una lista simplemente agregamos artículos sin ti t especificando cualquier clave ..

¿Alguien podría aclarar esto?

+11

Su pregunta es bastante explica por sí mismo ;-) – Seb

Respuesta

25

IDictionary es para mapas de valores de clave, ICollection es para conjuntos de objetos similares.

ICollection es una interfaz para colecciones de objetos similares: los controles en un formulario, los elementos en una lista, los atributos en una etiqueta XML, etc. A partir de .NET 2.0, hay una versión genérica, por lo que puede consultar una colección de enteros como ICollection<int>.

IDictionary es una interfaz para asignar un tipo de objeto o valor a otro. Funciona como un diccionario real, o una guía telefónica: tiene una "clave" en mente como el nombre de una persona, y cuando la busca, obtiene información que se identifica con esa clave, como una dirección o número de teléfono. Cada clave solo se puede enumerar una vez, aunque se permite que dos claves diferentes tengan el mismo valor. Esto también es genérico en .NET 2.0, por lo que un diccionario cuyas claves sean cadenas y cuyos valores sean enteros sería IDictionary<string,int>.

Un diccionario es en realidad una colección de pares clave/valor: puede usar IDictionary<int,string> como ICollection<KeyValuePair<int,string>>, y puede acceder a las claves y valores como colecciones separadas con las propiedades de Claves y valores.

Tanto ICollection y IDictionary son desordenada, lo que significa que aunque se puede recuperar los elementos en un orden con el método CopyTo o un bucle foreach, que el orden no tiene ningún significado especial, y podría cambiar sin razón aparente. Esa es la principal diferencia entre ICollection y IList: una lista le permite colocar elementos en posiciones específicas, como una matriz, y se quedan allí hasta que los mueva.

+0

thanq .. pero usted los pls explicar con un ejemplo de muestra .... – rockyashkumar

+0

verificación de los siguientes enlaces para 2 ejemplos: http://www.dotnetperls.com/diccionario http://www.dotnetperls.com/list – SShebly

+0

¿Alguna diferencia de rendimiento? –

6
  • Dictionary<K,V> es una matriz asociativa o mapa. Es un contenedor que puede ser indexado por valores de cualquier tipo.
  • List<T> es una matriz indexada entera. Es un contenedor indexado por enteros contiguos.

La diferencia esencial, por tanto, es en la forma en que se indexan los contenedores.

No caiga en la trampa de creer que Dictionary<int,T> es semánticamente equivalente a List<T>. La diferencia es que la indexación de List<T> es contigua, mientras que puede haber huecos en la indexación de Dictionary<int,T>.

8

List<> y Dictionary<,> - estructuras de datos bastante diferentes que se utilizan para diferentes propósitos, List es simplemente un conjunto de elementos y Dictionary es un conjunto de pares clave-valor.

El diccionario es bastante útil cuando tiene un conjunto de objetos complejos y quiere tener un acceso rápido digamos ObjectName/ObjectId, en este caso crea IDictionary<string, TObject> donde la clave sería ObjectId y Value sería un objeto en sí.

Algunas diferencias:

  • Lista persisten orden de los elementos, diccionario no
  • Lista permitir el acceso rápido por el índice
  • apoyo
  • Lista algoritmo integrado QuickSort de datos rápida de clasificación
  • diccionario permite ~ O(1) complejidad de tiempo para acceder a un elemento (valor) mediante una clave
0

Tengo una biblioteca de clases que accede a una variedad de sprocs de T-sql; cada sproc devuelve una sola fila pero con columnas variables. Necesitaba una solución de propósito general para recuperar los valores y Dictionary <> proporcionaba una solución mucho más limpia que List <>.

La clase común a todos los envoltorios declara

public Dictionary<string, String> datadict = new Dictionary<string, string>(); 

y

public Dictionary<string, String> LoadData(string sproc, string paramName, string paramValue) 

La invocación de un lector, el Datadict se carga con

for (int i = Reader.FieldCount; i != 0; i--) 
{ 
    datadict.Add(Reader.GetName(i - 1).Trim(), Reader.GetString(i - 1).Trim()); 
} 

y devuelve Datadict a la llamada clase que luego puede recuperar los datos de forma similar a como lo hace Reader; Ej .:

datadict = myData.LoadData("spGetSSN", "", ""); 
    ssn1 = datadict["SSN1"]; 
    ssn2 = datadict["SSN2"]; 
    ssn3 = datadict["SSN3"]; 

Mucho más limpio para mí que la lista <>.

Cuestiones relacionadas