2010-06-23 13 views
18
from x in myCollection 
    group x by x.Id into y 
    select new { 
     Id = y.Key, 
     Quantity = y.Sum(x => x.Quantity) 
    }; 

¿Cómo escribirías lo anterior como una expresión lambda? Estoy atascado en la parte group into.GroupBy en expresiones lambda

Respuesta

39

continuaciones de consulta (SELECT ... INTO y el grupo ... en, pero no ... unirse a) son equivalentes a simplemente dividiendo la expresión de consulta. Por eso me gusta pensar en su ejemplo, como:

var tmp = from x in myCollection 
      group x by x.Id; 
var result = from y in tmp 
      select new { 
       Id = y.Key, 
       Quantity = y.Sum(x => x.Quantity) 
      }; 

cambio, aquellos en notación de puntos:

var tmp = myCollection.GroupBy(x => x.Id); 
var result = tmp.Select(y => new { 
       Id = y.Key, 
       Quantity = y.Sum(x => x.Quantity) 
      }); 

entonces se podría combinar de nuevo:

var tmp = myCollection.GroupBy(x => x.Id) 
         .Select(y => new { 
           Id = y.Key, 
           Quantity = y.Sum(x => x.Quantity) 
           }); 

Una vez que trabajar con lo que el El compilador C# lo hace con expresiones de consulta, el resto es relativamente sencillo :)

5
myCollection 
    .GroupBy(x => x.Id) 
    .Select(x => 
     new 
     { 
      Id = x.Key, 
      Quantity = x.Sum(y => x.Quantity 
     }); 
7
myCollection.GroupBy(x => x.Id) 
      .Select(y => new { 
           Id = y.Key, 
           Quantity = y.Sum(x => x.Quantity) 
          }); 
1
 var mostFrequent = 
      lstIn.Where(i => !string.IsNullOrEmpty(i)) 
       .GroupBy(s => s) 
       .OrderByDescending(g => g.Count()) 
       .Select(s => s.Key) 
       .FirstOrDefault(); 
+3

Debe agregar algo de texto que explique qué hace esta respuesta y por qué proporciona una solución al problema específico. Los volcados de código rara vez son útiles para otras personas. –

-1

Por lo tanto, para la mayoría de las respuestas aquí, todo el mundo parece estar tratando con obtener un objeto simple de Id hecho a partir del recuento del grupo, y la clave misma que es group.Key.

Aunque ese es probablemente el uso principal de esto. Realmente no satisfizo mis necesidades.

Para mi propio caso, básicamente quería agrupar por alguna propiedad de objeto, luego buscar un objeto específico de ese grupo. Aquí hay un código de muestra.

using System; 
using System.Collections.Generic; 
using System.Linq; 

public class Program 
{ 
    public static void Main() 
    { 
     Console.WriteLine("Hello World"); 
     var response = new List<ResponseClass>(); 
      var listOfStudents = new List<Student>(); 
      // Insert some objects into listOfStudents object. 
      listOfStudents.GroupBy(g => g.Class).ToList() 
       .ForEach(g => response.Add(g.OrderByDescending(s => s.CreatedOn).Select(a => 
       new ResponseClass 
       { 
        SName = a.StudentName, 
        SAge = a.Age, 
        SClass = a.Class, 
        SCreatedOn = a.CreatedOn, 
        RandomProperty = Guid.NewGuid().ToString() 
       }) 
       .First())); 

       Console.WriteLine("This compiles and should work just fine"); 
    } 
    class Student 
    { 
     public string StudentName { get; set; } 
     public int Age { get; set; } 
     public string Class { get; set; } 
     public DateTime CreatedOn { get; set; } 
    } 

    class ResponseClass 
    { 
     public string SName { get; set; } 
     public int SAge { get; set; } 
     public string SClass { get; set; } 
     public DateTime SCreatedOn { get; set; } 
     public string RandomProperty { get; set; } 
    } 
} 

Si prefiere utilizar un bucle foreach (yo prefiero lambda como me resulta más fácil de leer), pero si lo hace, se podría hacer como tal.

Espero que esto ayude a alguien. :)