[英]complex LINQ query
考慮一下這個集合
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查詢以對Age on Person進行分組,然后計算具有相同名稱的每個組中的人數?
我嘗試使用group by運算符,嵌套查詢所有可能性仍然無法弄清楚確切的查詢。
此致,Jeez
怎么樣
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
};
Names屬性的名稱為Key,然后您可以為每個名稱獲取Count()
。
基本相同:
var peeps =
people.GroupBy(p => p.Age).Select(gp => new
{
Aged = gp.Key,
Count = gp.Count(),
NameGrp = gp.GroupBy(pers => pers.Name)
});
吉姆
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));
這與年齡和姓名的分組沒有什么不同,包括計數和按年齡和名稱的可選順序。 對的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);
}
}
非常清楚這里的唯一鍵是什么,它可以更改,而不必更改剩余程序的結構。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.