C #: ¿Eliminar valores duplicados del diccionario?

¿Cómo puedo crear un diccionario sin valores duplicados de un diccionario que pueda tener valores duplicados?

IDictionary myDict = new Dictionary(); myDict.Add("1", "blue"); myDict.Add("2", "blue"); myDict.Add("3", "red"); myDict.Add("4", "green"); uniqueValueDict = myDict.??? 

Editar:

-No me importa qué llave se guarda. – ¿Hay algo que use la operación Distinct ()?

¿Qué quieres hacer con los duplicados? Si no te importa qué clave pierdes, simplemente crea otro diccionario como este:

 IDictionary myDict = new Dictionary(); myDict.Add("1", "blue"); myDict.Add("2", "blue"); myDict.Add("3", "red"); myDict.Add("4", "green"); HashSet knownValues = new HashSet(); Dictionary uniqueValues = new Dictionary(); foreach (var pair in myDict) { if (knownValues.Add(pair.Value)) { uniqueValues.Add(pair.Key, pair.Value); } } 

Eso supone que estás utilizando .NET 3.5, por cierto. Déjame saber si necesitas una solución .NET 2.0.

Aquí hay una solución basada en LINQ que encuentro agradablemente compacta …

 var uniqueValues = myDict.GroupBy(pair => pair.Value) .Select(group => group.First()) .ToDictionary(pair => pair.Key, pair => pair.Value); 

La solución de fuerza bruta sería algo como lo siguiente

 var result = dictionary .GroupBy(kvp => kvp.Value) .ToDictionary(grp => grp.First().Value, grp.Key) 

asumiendo que realmente no te importa la clave utilizada para representar un grupo de duplicados y que es aceptable reconstruir el diccionario.

Jon me venció a la solución .NET 3.5, pero esto debería funcionar si necesita una solución .NET 2.0:

  List vals = new List(); Dictionary newDict = new Dictionary(); foreach (KeyValuePair item in myDict) { if (!vals.Contains(item.Value)) { newDict.Add(item.Key, item.Value); vals.Add(item.Value); } } 
 foreach (var key in mydict.Keys) tempdict[mydict[key]] = key; foreach (var value in tempdict.Keys) uniquedict[tempdict[value]] = value; 
 Dictionary test = new Dictionary(); test.Add("1", "blue"); test.Add("2", "blue"); test.Add("3", "green"); test.Add("4", "red"); Dictionary test2 = new Dictionary(); foreach (KeyValuePair entry in test) { if (!test2.ContainsValue(entry.Value)) test2.Add(entry.Key, entry.Value); } 

Así es como lo hice:

  dictionary.add(control, "string1"); dictionary.add(control, "string1"); dictionary.add(control, "string2"); int x = 0; for (int i = 0; i < dictionary.Count; i++) { if (dictionary.ElementAt(i).Value == valu) { x++; } if (x > 1) { dictionary.Remove(control); } } 

Además de la respuesta de Jon Skeet, si su valor es un objeto interno, puede usar:

 var uniqueValues = myDict.GroupBy(pair => pair.Value.Property) .Select(group => group.First()) .ToDictionary(pair => pair.Key, pair => pair.Value); 

De esta manera, eliminará el duplicado solo en una propiedad del objeto

Solo una nota a pie de página para aquellos que utilizan la API de Revit, este es un método que me funciona para eliminar elementos duplicados, cuando no puede usar dicho tipo de objeto como su tipo de objeto y, en cambio, necesita aprovechar los elementos en bruto. es una bella compañera

  //Add Pair.value to known values HashSet HashSet knownValues = new HashSet(); Dictionary uniqueValues = new Dictionary(); foreach (var pair in wall_Dict) { if (knownValues.Add(pair.Value)) { uniqueValues.Add(pair.Key, pair.Value); } }