簡體   English   中英

了解LINQ子查詢

[英]Understanding LINQ subquery

我在foreach使用了普通查詢來達到目標​​,但是我認為有更好的方法。

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

如何使用純LINQ獲取所有子列表的max AnimalAreaList內的class AnimalList ,並且包含一個稱為IDInt32AreaList和Lambda是受歡迎的,因此不必着急回答,因為您只知道lambda回答;)

public class Zoo
{
    public List<Area> AreaList {get; set;}
}

public class Area
{
    public List<Animal> AnimalList {get; set;}
}

public class Animal
{
    public List<int> Id {get; set;}
}

只有簡短的形式,所以沒有人會混淆;)

盡管SelectMany可以工作,但我覺得在這種情況下查詢更易讀。

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

您正在尋找嵌套的SelectMany

SelectMany將返回一個單一IEnumerable<T>從許多“內” Ienumerable<T> -所以Zoo.SelectMany(a => a.AreaList)將返回一個單一IEnumerable<Area>包含所有IEnumerable<Area>Area屬性-然后對Area類中的List<Animal>再做一次:

樣本數據:

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

結果:11

在查詢語法中,您可以通過鏈接from子句來執行SelectMany ,如gxp的答案所示。 (個人而言,我更喜歡方法鏈接語法,因此花了一些時間才弄清楚方法...)

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

所有AnimalLists的所有最大值的最大值及其最大值。

這實際上與ZoharPeled的SelectMany相同,除了他拉平列表並取所有項目的最大值,而我一次又一次取每個列表的最大值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM