2012-03-29 17 views
7

Tengo una lista que quiero poner en un diccionario, para simplificar, los valores que se insertan serán todos iguales.C# ToDictionary con ContainsKey check

Puedo usar un bucle foreach.

List<string> list = new List<string>(); 
    list.Add("Earth"); 
    list.Add("Wind"); 
    list.Add("Fire"); 
    list.Add("Water"); 
    list.Add("Water"); // Will NOT BE INSERTED using the foreach loop 

    var myDictionary= new Dictionary<string, int>(); 
    foreach (string value in list) 
    { 
     if (!myDictionary.ContainsKey(value)) 
     { 
     myDictionary.Add(value, 1); 
     } 
    } 

Lo anterior funciona.

Pero quiero usar ToDictionary hacer lo mismo de la siguiente manera -

Dictionary<string, int> myDictionary2 = list.ToDictionary(i => i, i => 1); 

Por supuesto esto no funciona debido a que estoy añadiendo "agua" dos veces.

¿Cuál es la forma correcta de buscar entradas duplicadas al usar ToDictionary?

Respuesta

14

Usted podría utilizar Distinct() para filtrar duplicados:

Dictionary<string, int> myDictionary2 = list.Distinct().ToDictionary(i => i, i => 1); 

El mismo enfoque haría que su lazo tradicional mucho más clara también, ya que no tiene que comprobar "manual" para los duplicados:

foreach (string value in list.Distinct()) 
{ 
    myDictionary.Add(value, 1); 
} 
+6

Esto funcionará, pero me pregunto si OP realmente quiere un conjunto. – Gabe

+0

@Gabe: No estoy seguro de no entender su comentario en el contexto de la pregunta. ¿Puede aclarar? – BrokenGlass

+1

Un diccionario donde todos los valores son 1 es esencialmente solo un conjunto. Si el usuario nunca accede a los valores, no es necesario un diccionario real. – Gabe

7

Distinct es una opción que evita el problema de la duplicación de la clave. Si necesita un recuento de duplicados, puede intentar algo más parecido a este GroupBy de la siguiente manera:

var dict = list.GroupBy(i => i).ToDictionary(g => g.Key, g => g.Count()); 

Si su aplicación no es sólo una estructura de lista de cadenas simples/duplicar cargos, podría obtener algún provecho de la elección una estructura diferente como Lookup que puede obtener al llamar a la extensión ToLookup -o, posiblemente, ir con una Agrupación como la GroupBy que utilicé anteriormente.