2009-12-28 14 views
5

Tengo una expresión lambda que obtiene resultados de un diccionario.C# Linq Result ToDictionary Help

var sortedDict = (from entry in dctMetrics 
        orderby entry.Value descending 
        select entry); 

La expresión retrae los pares que necesito, puedo verlos en el modo de depuración del IDE.

¿Cómo puedo convertir esto a un diccionario del mismo tipo que la fuente? Sé que SortedDict's TElement es un KeyValuePair, pero estoy teniendo problemas para comprender por completo la sintaxis del método de extensión ToDictionary. También probé a foreach'ing el resultado var para construir por partes un nuevo diccionario, pero fue en vano.

¿Existe algo como esto (la funcionalidad del reloj):

var results = (from entry in dictionary 
       orderby entry.Value descending 
       select entry); 
Dictionary<string,float> newDictionary = results as (Dictionary<string,float>); 
+0

La sintaxis Lambda tiene la forma 't => Func '. Ver la respuesta de mquander - 'r => r.Key' y' r => r.Value' son lambdas. No los confunda con expresiones de consulta ('de x en y seleccione x'). – Aaronaught

Respuesta

15

Usted puede hacerlo de esta manera:

var newDictionary = results.ToDictionary(r => r.Key, r => r.Value); 

Leer que a medida "para cada par de resultados, añadir ese elemento a la nuevo diccionario, donde la clave se producirá como la clave del par, y el valor se producirá como el valor del par ".

Además, solo en función de su código de muestra, debe tener en cuenta que Dictionary<T, U> se implementa como una tabla hash, por lo que no mantendrá el orden de los elementos que ponga en ella. Considere usar un SortedDictionary o un SortedList en su lugar si necesita un mapa ordenado.

+0

¡Muchas gracias! ¡Resolvió mis problemas! – Simpleton

+0

Jajaja, me encanta lo complicado que es obtener algunos de mis códigos, y luego 5 segundos en SO y es 1/10 del tamaño ... tan simple –

+0

la clave no aparece después de tipear r. – Kenta