Linq for nested loop

本文关键字:loop nested for Linq | 更新日期: 2023-09-27 18:32:23

>我有一个循环如下:

foreach(x in myColl) 
{
    foreach(var y in x.MyList) 
    {
        result.Add(x.MyKey + y)
    }
}

这意味着在我的内部循环中,我需要访问当前外部元素的属性。

我正在寻找一个 LINQ 语句,但我不确定它。我尝试了使用

result = myColl
    .SelectMany(x => x.MyList)
    .SelectMany(x => /* how to get the key of the outer loop here */ + x)

Linq for nested loop

使用查询表达式很容易:

(from x in myColl
 from y in x.MyList
 select x.MyKey + y).ToList()

这是有效的,因为这转化为:

myColl
.SelectMany(x => x.MyList.Select(item => new { List = x, Item = item }))
.Select(x => ...) //rest of the query, whatever you like

关键是同时保留列表和列表项。使用匿名类型(或任何其他容器)通过查询引导它们。

这是我个人更喜欢查询语法的时候

var result = from x in myCol1
             from y in x.MyList
             select x.MyKey + y;

SelectMany 有一个重载,它允许访问"父"元素。ListOfList.SelectMany(list=>list.InnerList,(lst,element)=> HandleInnerListAndElementFromIt(lst,element))

 result = myColl.SelectMany(x => x.MyList,(x1,x2)=>DoSomething(x1,x2));

编辑已添加:

对于您的具体示例,它如下所示:

result = myColl.SelectMany(x=>x.MyList,(x,y)=>x.MyKey+y));

请注意,SelectMany 方法调用有两个 lambda 参数

第一个 lambda 将采用"x"并返回一个新的枚举。x=>x.MyList

第二个 lambda 取 "x" 和 "y" 并产生一个新结果。(x,y)=>x.MyKey+y