嵌套的foreach成为一个链式linq表达式

时间:2013-12-20 13:34:21

标签: c# linq

我不知道是否有可能按照我的想法行事,但我觉得值得尝试:)

我可以将这两个嵌套的foreach结合起来吗?

foreach ( var dept in curDevice.Personnel.Department.Company.Departments )
{
    foreach ( var personnel in dept.Personnels )
    {
        myPersonnels.Add(personnel);
    }
}

我想将每个嵌套为一个链式linq表达式。有可能吗?如果是这样的话?

4 个答案:

答案 0 :(得分:5)

使用Enumerable.SelectMany

foreach ( var personnel in
 curDevice.Personnel.Department.Company.Departments.SelectMany(x=> x.Personnels))
{
    myPersonnels.Add(personnel); 
}

答案 1 :(得分:3)

使用SelectMany<TSource, TResult>方法:

var allPersonnel = curDevice.Personnel.Department.Company.Departments.SelectMany(dept => dept.Personnels);

// If there is no AddRange method:
foreach (var personnel in allPersonnel)
    myPersonnels.Add(personnel);

// If there is an AddRange method:
myPersonnels.AddRange(personnel)

答案 2 :(得分:2)

这是人员偏好(看看我在那里做了什么?),但我喜欢坚持功能编程,如果这是我的开始。

您可以使用foreach方法替换List<T>.ForEach语言构造。

curDevice.Personnel.Department.Company.Departments
    .SelectMany(department => department.Personnels)
    .ToList()
    .ForEach(personnel => myPersonnels.Add(personnel);

通常,我们会为委托使用较短的参数名称:

curDevice.Personnel.Department.Company.Departments
    .SelectMany(d => d.Personnels)
    .ToList()
    .ForEach(p => myPersonnels.Add(p);

而且,如果myPersonnels只是一个集合,您可以直接创建它:

var myPersonnels = curDevice.Personnel.Department.Company.Departments
    .SelectMany(d => d.Personnels)
    .ToList();

或者,如果它已经是List<T>,您可以为其添加IEnumerable<T>

myPersonnels.AddRange(
    curDevice.Personnel.Department.Company.Departments
        .SelectMany(d => d.Personnels)
);

答案 3 :(得分:1)

Ken几乎是正确的,但是如果我是对的,myPersonnels列表是一个外部的列表,您要复制“查询”的结果。前两个答案非常易读,但如果您想稍后编写代码,可以写下:

curDevice.Personnel.Department.Company.Departments
    .SelectMany(x => x.Personnels) // selecting the personnels
    .ToList()
    .Foreach(myPersonnels.Add); // iterate trough the personnels list and copy them into the external list