簡體   English   中英

LINQ表達式而不是嵌套的foreach循環

[英]LINQ expression instead of nested foreach loops

我有以下兩種情況:

public class Client{
    public List<Address> addressList{get;set;}
} 

public class Address{
    public string name { get; set; }
}

我有一個名為testList Client類型的列表。 它包含n個客戶端,每個客戶端包含n個地址

List<Client> testList;

我如何使用LINQ執行以下操作:

foreach (var element in testList)
{
    foreach (var add in element.addressList)
    {
        console.writeLine(add.name);
    }
} 

好吧,我不會將Console.WriteLine放在lambda表達式中,但是您可以使用SelectMany來避免嵌套:

foreach (var add in testList.SelectMany(x => x.addressList))
{
    Console.WriteLine(add.name);
}

我幾乎沒有理由將結果轉換為列表,然后使用List<T>.ForEach ,這是該語言的完美foreach循環的一部分。 就像您自然地沒有一個委托來應用每個名稱一樣,例如作為方法參數-您始終只是在寫控制台。 有關更多想法,請參閱Eric Lippert的博客文章

(我也強烈建議您開始遵循.NET命名約定,但這是另一回事。)

foreach(var a in testList.SelectMany(c => c.addressList))
{
    Console.WriteLine(a.name);
}

它不會實現任何新集合。

這可能會有所幫助:

testList.ForEach(i => i.addressList.ForEach(j => Console.WriteLine(j.name)));
foreach(var add in testList.SelectMany(element => element.addressList)){
    Console.WriteLine(add.name);
}
testList.SelectMany(c => c.addressList)
        .Select(a => a.name)
        .ToList()
        .ForEach(Console.WriteLine)

使用ForEach方法:

testList.ForEach(tl=>tl.addressList.ForEach(al=>console.writeLine(al.name)));

LINQ不包含ForEach函數, 並且它們也不打算這樣做 ,因為它與LINQ是函數方法的想法背道而馳。 因此,您無法在單個語句中執行此操作。 List<T>有一個ForEach方法,但是出於與LINQ中不相同的原因,我建議不要使用此方法。

但是,您可以使用LINQ來簡化代碼,例如

foreach (var add in testList.SelectMany(x => x.addressList))
{
    Console.WriteLine(add.name);
}
// or
foreach (var name in testList.SelectMany(x => x.addressList).Select(x => x.name))
{
    Console.WriteLine(name);
}

暫無
暫無

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

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