2011-05-10 24 views
10

tengo un diccionario en C#:c diccionario # género con LINQ

public Dictionary<Product, int> 

y me gustaría obtener mi resultado en una lista genérica:

List<Product> productList = new List<Product>(); 

Con los productos orderder descendiendo por la valor int en el diccionario. He intentado usar el método orderby, pero sin éxito. ¡Gracias!

+0

Cuando dice sin éxito, ¿obtiene una excepción de tiempo de ejecución? ¿O es que el resultado no está ordenado de la forma esperada? ¿Qué código de pedido está probando actualmente, en caso de que las respuestas proporcionadas ya coincidan con lo que ha hecho? – Yuck

+0

Utilicé orderby() en los valores, pero no sabía que podía recuperar los valores clave con select(). Así que el problema se resolvió :) – Johan

+3

Tal vez deberías considerar usar un 'SortedDictionary' – Magnus

Respuesta

21

Usted puede hacer eso usando:

List<Product> productList = dictionary.OrderByDescending(kp => kp.Value) 
             .Select(kp => kp.Key) 
             .ToList(); 
+0

Gracias, a todos. Pregunta de seguimiento: ¿Utilizo el método Take para obtener x número de resultados? Si quiero un límite – Johan

+0

Sí, puede usar .Take (x) para obtener x resultados. (Y Omitir() si está intentando hacer paginación Recuerde que el orden de estos operadores es importante). – driis

+0

Sí, puede usar Take (int n) para limitar su selección – Stecya

6
MyDict.OrderByDescending(x => x.Value).Select(p => p.Key).ToList(); 
6

probar este

List<Product> productList = dictionary.OrderByDescending(x => x.Value).Select(x => x.Key).ToList(); 
5

Aquí hay un ejemplo usando la sintaxis de consulta LINQ.

public class TestDictionary 
    { 
     public void Test() 
     { 
      Dictionary<Product, int> dict=new Dictionary<Product, int>(); 
      dict.Add(new Product(){Data = 1}, 1); 
      dict.Add(new Product() { Data = 2 }, 2); 
      dict.Add(new Product() { Data = 3 }, 3); 
      dict.Add(new Product() { Data = 4 }, 9); 
      dict.Add(new Product() { Data = 5 }, 5); 
      dict.Add(new Product() { Data = 6 }, 6); 

      var query=(from c in dict 
       orderby c.Value descending 
       select c.Key).ToList();  
     } 
     [DebuggerDisplay("{Data}")] 
     public class Product 
     { 
      public int Data { get; set; } 
     }   
    } 
+1

"pure Linq" es una declaración muy polémica, porque su consulta se compilará en la cadena de métodos anterior. Aún más "puro" sería escribir cadenas de métodos IEnumerable con delegados. – Nappy