2011-03-01 107 views
7

考虑收集复杂的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} 
     }; 

现在的问题是:我怎么能写上年龄LINQ查询到人团再算上的人数量每组具有相同的名称?

我尝试使用group by操作符,嵌套查询的所有可能性仍然无法找出确切的查询。

问候, 哎呀

回答

9

如何

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 
      }; 

名称属性将命名为重点,然后你可以得到Count()每个名称。

+0

+1 - 完全按照要求;) –

+0

完美,这就是我一直在寻找:) – JeeZ

2

基本相同:

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

吉姆

0

这不是由年龄和名字,包括年龄和名字计数和可选顺序分组不同。在对LINQ操作通常可以通过简单地使用匿名类型,像这样做:

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); 
    } 
} 

这是非常清楚的唯一关键是这儿有什么,它是可以改变的,而不必也改变了剩余节目的结构。

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));