了解LINQ子查询

时间:2018-04-26 09:54:56

标签: c# list linq lambda

我在foreach内使用普通查询来达到目标​​,但我认为有更好的方法。

int max = 0;
foreach(Area area in myZoo.AreaList)
{
    max = (from a in area.AnimalList
           select a.ID).Max();
}
return max;

如何使用纯LINQ获取所有子列表的max? (AnimalListclass Animal的{​​{1}},其中包含一个名为AreaList的{​​{1}} Erm,欢迎使用Lambda,所以不要只是因为你只知道lambda答案而不肯回答;)

Int32

只有简短形式,所以没有人感到困惑;)

3 个答案:

答案 0 :(得分:3)

虽然SelectMany有效,但我认为在这种情况下查询更具可读性。

var max = (from area in myZoo.AreaList
           from animal in area.AnimalList
           from id in animal.Id
           select id).Max();

答案 1 :(得分:1)

您正在寻找嵌套的SelectMany

SelectMany将从众多“内部”IEnumerable<T>返回一个Ienumerable<T> - 因此Zoo.SelectMany(a => a.AreaList)将返回包含所有IEnumerable<Area>的{​​{1}}个IEnumerable<Area>来自Area属性 - 然后您再次为List<Animal>类中的Area执行此操作:

示例数据:

var zoo = new Zoo() {
    AreaList = new List<Area>()
    {
        new Area() 
        {
            AnimalList = new List<Animal>()
            {
                new Animal() {Id = new List<int>() {1, 2, 3}},
                new Animal() {Id = new List<int>() {4, 5, 6}}
            }
        },
        new Area() 
        {
            AnimalList = new List<Animal>()
            {
                new Animal() {Id = new List<int>() {7, 8, 9}},
                new Animal() {Id = new List<int>() {10, 11}}
            }
        },
    }
};

Linq查询:

var max = zoo.AreaList.SelectMany(a => a.AnimalList).SelectMany(a => a.Id).Max();

Console.WriteLine(max);

结果:1​​1

在查询语法中,您可以通过链接SelectMany子句来from,如gxp的答案所示。 (就个人而言,我更喜欢方法链接语法,所以花了一些时间来计算出那个......)

答案 2 :(得分:1)

var max = zoo.AreaList.Max(arl => arl.AnimalList.Max(anl => anl.Id)).Max();

所有AnimalLists的所有最大值的最大值,以及它们的最大值。

这与ZoharPeled的SelectMany的效果相同,只不过他会使列表变得扁平化并占据我一次又一次地取每个列表最大值的所有项目的最大值。