gpt4 book ai didi

linq - 使用 Fluent 语法的 LINQ 嵌套 GroupBy

转载 作者:行者123 更新时间:2023-12-04 23:40:30 24 4
gpt4 key购买 nike

我正在尝试使用 fluent(即“方法”)语法编写嵌套的 GroupBy LINQ 表达式。

这是我的类(class)和数据:

class Person
{
public String ZipCode, Gender, Name;
}

private static List<Person> people = new List<Person>
{
new Person { ZipCode= "11111", Gender = "M", Name = "Tom" },
new Person { ZipCode= "11111", Gender = "M", Name = "Bob" },
new Person { ZipCode= "11111", Gender = "F", Name = "Nancy" },
new Person { ZipCode= "11111", Gender = "F", Name = "Lisa" },
new Person { ZipCode= "22222", Gender = "M", Name = "Dan" },
new Person { ZipCode= "33333", Gender = "F", Name = "Mary" },
new Person { ZipCode= "44444", Gender = "F", Name = "Joan" },
new Person { ZipCode= "44444", Gender = "F", Name = "Jane" },
new Person { ZipCode= "44444", Gender = "M", Name = "Bill" }
};

我想要实现的是一个按 ZipCode 分组的对象然后通过 GenderZipCode .就对象类型而言,我正在寻找:
IEnumerable<IGrouping<string, IEnumerable<IGrouping<string, Person>>>>

这将允许我像这样访问查询结果:
foreach(var byZip in mainQuery) {
Console.WriteLine(byZip.Key); // print the ZipCode
foreach(var byGender in byZip) {
Console.WriteLine(byGender.Key) // print the Gender
foreach (Person p in byGender)
Console.WriteLine(p.Name);
}
}

同样,我希望使用流畅的符号。

根据下面杰夫的回答,这是查询和访问:
IEnumerable<IGrouping<string, IEnumerable<IGrouping<string, Person>>>> query = 
people
.GroupBy(p => p.ZipCode)
.GroupBy(
keySelector: g => g.Key,
elementSelector: g => g.GroupBy(p => p.Gender)
);


foreach (IGrouping<string, IEnumerable<IGrouping<string, Person>>> byZip in query)
{
Console.WriteLine(byZip.Key); // print the ZipCode
foreach (IEnumerable<IGrouping<string, Person>> byGender in byZip)
{
foreach (IGrouping<string, Person> t in byGender)
{
Console.WriteLine(t.Key); // print the Gender
foreach (Person y in t)
Console.WriteLine(y.Name);
}

}
}

最佳答案

在查询语法中,你可以这样写:

var query =
from p in people
group p by p.ZipCode into g
let gender =
from p in g
group p by p.Gender
group gender by g.Key;

并使用“流畅”语法将其转换为:
var query2 = people.GroupBy(p => p.ZipCode)
.GroupBy(
g => g.Key,
g => g.GroupBy(p => p.Gender)
);

但是,您想要访问它的方式与实际类型不匹配。您的访问模式使您的类型实际上是:
IEnumerable<IGrouping<string, IGrouping<string, Person>>>

所以查询应该是:
var query =
from p in people
group p by p.ZipCode into g
let gender =
from p in g
group p by p.Gender
from g2 in gender
group g2 by g.Key;

而转换……有点复杂。
var query2 = people.GroupBy(p => p.ZipCode)
.SelectMany(g =>
g.GroupBy(p => p.Gender).GroupBy(g2 => g.Key)
);

关于linq - 使用 Fluent 语法的 LINQ 嵌套 GroupBy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39001256/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com