2011-03-01 24 views
7

Considerar la coleccióncompleja consulta LINQ

List<Person> people = new List<Person> 
     { 
      new Person{Name = "A", SSN="1", Age = 23}, 
      new Person{Name = "A", SSN="2", Age = 23}, 
      new Person{Name = "B", SSN="3", Age = 24}, 
      new Person{Name = "C", SSN="4", Age = 24}, 
      new Person{Name = "D", SSN="5", Age = 23} 
     }; 

La pregunta es: ¿Cómo puedo escribir una consulta LINQ para agrupar persona de la edad y luego contar el número de personas con en cada grupo que tiene el mismo nombre?

Intenté usar el grupo por operador, las consultas anidadas todas las posibilidades todavía no podían encontrar la consulta exacta.

Saludos, Por Dios

Respuesta

9

¿Qué tal

var ages = from p in people 
      group p by p.Age into g 
      select new { 
       Age = g.Key, 
       Count = g.Count(), 
       Names = from prs in g 
         group prs by prs.Name 
      }; 

los nombres de propiedad tendrá el nombre como la clave y, a continuación, puede obtener Count() para cada nombre.

+0

+1 - exactamente como sea necesario;) –

+0

Perfecto, eso es lo que estaba buscando :) – JeeZ

2

básicamente el mismo que:

var peeps = 
    people.GroupBy(p => p.Age).Select(gp => new 
      { 
       Aged = gp.Key, 
       Count = gp.Count(), 
       NameGrp = gp.GroupBy(pers => pers.Name) 
      }); 

jim

0

Esto no es diferente de la agrupación por tanto la edad y el nombre, incluyendo el recuento y el orden opcionalmente por la edad y el nombre. operaciones de LINQ en pares por lo general se puede hacer mediante el simple uso de los tipos anónimos, así:

var people = new List<Person> { 
    new Person { FirstName = "John", LastName = "Leidegren", Age = 25 }, 
    new Person { FirstName = "John", LastName = "Doe", Age = 25 }, 
    new Person { FirstName = "Not john", LastName = "Doe", Age = 26 }, 
}; 

foreach (var g in (from p in people 
        group p by new { p.Age, p.FirstName })) 
{ 
    Console.WriteLine("Count: {0}", g.Count()); 

    foreach (var person in g.OrderBy(x => x.FirstName)) 
    { 
     Console.WriteLine("FirstName: {0}, LastName: {1}, Age: {2}" 
      , person.FirstName 
      , person.LastName 
      , person.Age); 
    } 
} 

Es muy claro cuál es la clave única está aquí y se puede cambiar sin tener que cambiar también la estructura del programa restante.

0
List<Person> persons = new List<Person> 
{ 
    new Person{Name = "A", SSN="1", Age = 23}, 
    new Person{Name = "A", SSN="2", Age = 23}, 
    new Person{Name = "B", SSN="3", Age = 24}, 
    new Person{Name = "C", SSN="4", Age = 24}, 
    new Person{Name = "D", SSN="5", Age = 23} 
}; 
var out1 = persons.GroupBy(p => new { p.Age, p.Name }).Select(s => new { Name = s.Key.Name,age = s.Key.Age, cnt = s.Count() }); ; 
System.Threading.Tasks.Parallel.ForEach(out1, item => Console.WriteLine(item.Name + " " + item.age + " " + item.cnt));