2010-07-26 13 views
10

Cuál es la manera 'mejor' para ordenar (o repetir) durante un StringDictionary en orden de Valor (no Key)C# ordenar una StringDictionary por valor, NO clave

P. ej Key - Valor

  • 1 - X etiqueta
  • 2 - Una etiqueta
  • 3 - Otras etiqueta

daría

  • 2 - Una etiqueta
  • 3 - Otra etiqueta
  • 1 - Etiqueta X

EDITAR - Yo quería decir "utilizando .NET 2.0 características". En este momento, mi mal ...

Respuesta

14

uso de LINQ:

var items = from k in d.Keys 
        orderby d[k] ascending 
        select k; 

Si usted está restringido a C# 2.0 características, utilice esto:

IDictionary<string, string> d = new Dictionary<string, string>(); 
    d["1"] = "X label"; 
    d["2"] = "A label"; 
    d["3"] = "Other Label"; 

    List<KeyValuePair<string, string>> myList = new List<KeyValuePair<string, string>>(d); 
    myList.Sort(
     delegate(KeyValuePair<string, string> a, 
     KeyValuePair<string, string> b) 
     { 
      return a.Value.CompareTo(b.Value); 
     } 
    ); 

Nota: Si está utilizando una vez StringDictionary of Dictionary, mira la solución de Anthony.

+0

46 segundos ..... – Will

+0

En realidad esto sólo ordenar los valores, no las teclas asociadas también. – SWeko

+2

@Sweko selecciona claves ordenadas por valor (d [k] = valor). – Will

4

Usando la clase StringDictionary, este es un método para usar el OrderBy de LINQ. Asume que tienes .NET 3.5.

var sortedDictionary = dictionary.Cast<DictionaryEntry>().OrderBy(pair => pair.Value); 

Usando 2.0, es un poco más complicado. Aquí hay un enfoque usando un delegado de Comparación.

StringDictionary dictionary = new StringDictionary(); 
dictionary.Add("1", "One"); 
dictionary.Add("2", "Two"); 
dictionary.Add("3", "Three"); 

DictionaryEntry[] sortedDictionary = new DictionaryEntry[dictionary.Count]; 
dictionary.CopyTo(sortedDictionary, 0); 
Comparison<DictionaryEntry> comparison = new Comparison<DictionaryEntry>(delegate (DictionaryEntry obj1, DictionaryEntry obj2) { return ((string)obj1.Value).CompareTo((string)obj2.Value); }); 
Array.Sort(sortedDictionary, comparison); 

Así que el tipo real estaría en la matriz ordenadaDiccionario.

+0

+1: Es posible que necesite un manejo especial cuando obj1! = Null (a menos que pueda garantizar lo contrario). –

+1

@Binary, que puede valer la pena explorar, sin duda. El escenario más probable es que obj1.Value podría ser nulo. Entonces, absolutamente agregue cheques según sea necesario. –

Cuestiones relacionadas