2012-01-14 14 views
9

¿Hay alguna manera de iterar sobre un diccionario, en orden ordenado, ordenado por VALOR no clave? Lo leí sobre el objeto "SortedDictionary", pero lamentablemente, eso está ordenado por clave. Una solución sería cambiar todas mis claves con mis valores y colocarlas en SortedDictionary (ya que son enteros). Sin embargo, tampoco estoy seguro de cómo hacerlo.C# Iterar sobre Diccionario ordenado por valor

+1

¿Con qué frecuencia tiene que hacerlo? ¿Qué tan eficiente tiene que ser? ¿Estás dispuesto a intercambiar memoria para una mayor velocidad? – svick

+0

Solo funcionará en aproximadamente 500 resultados, y solo una vez. Siempre dispuesto a intercambiar memoria para una mayor velocidad: D –

Respuesta

18

Obtenga los pares de claves/valores, ordénelos e itere. Muerto fácil usando LINQ:

foreach(var pair in dictionary.OrderBy(p => p.Value)) { 
    // work with pair.Key and pair.Value 
} 
+0

¡Ahh, gracias! :) Eso se ve exactamente como lo que necesito. Este LINQ que sigo escuchando, ¿qué es? –

+2

@GeorgesOatesLarsen: es algo que te estás perdiendo al no usarlo. Es posible que desee leer [esto] (http://msdn.microsoft.com/en-us/library/bb308959.aspx) o Google (a estas alturas, habrá mejores presentaciones). – Jon

0

Para finalizar, el código se ha sugerido anteriormente (dictionary.OrderBy (p => Valor PD)) "no" para este tipo de trabajo personalizados.

OrderBy utiliza IComparable para poder comparar dos objetos. Si el valor de su diccionario es un tipo personalizado, entonces debe implementar IComparable para poder ordenar los valores de manera adecuada.

Leer en here.

+0

"debe implementar IComparable" - no necesariamente. OrderBy() viene en dos sobrecargas. Uno de ellos se comporta como lo describió, pero el segundo acepta un objeto personalizado IComparable por lo que se puede ordenar cualquier tipo de valor. – DXM

+0

@DXM, la otra sobrecarga acepta 'IComparer', no' IComparable', que no tendría mucho sentido. Además, no creo que esto tenga nada que ver con los tipos de valores, funciona igual para cualquier tipo. – svick

+0

@svick - mi mal en el error tipográfico, tienes razón, es IComparer, pero esa segunda sobrecarga exactamente para lo que el OP está pidiendo. Puede escribir su propio objeto comparador para comparar todo lo que desee y alimentarlo en OrderBy(). Y por "valor" no quise decir valor vs. referencia. Quise decir valor vs. clave. Me doy cuenta de que el comparador trabajará con tipos de valores y tipos de referencia. Si está de acuerdo con esta respuesta, OrderBy solo puede ser utilizado por los tipos que implementan IComparable, ¿puede explicar para qué sirve esa segunda sobrecarga? – DXM

0

// diccionario ordenar por valor

foreach (KeyValuePair<datatype, datatype> item in dictionary) 
{ 
//do something by value....accessing item.value 
}