使用lambda将带有列表的元素列表转换为单个列表

时间:2016-03-16 10:31:14

标签: c# list lambda

我有家庭清单,每个家庭都有一份居民名单。我希望有一个函数返回所有家庭的所有居民的列表。

到目前为止我所拥有的:

public List<Resident> Residents() {
    var list = new List<Resident>();
    Households.ForEach(x => list.AddRange(x.Residents));
    return list;
}

是否可以用lambda来缩短它?像这样:

public List<Resident> Residents => { ??? }

我知道如果家庭是我可以使用的SelectMany列表,但事实并非如此。

EDIT1:

为了说清楚,家庭是一个阶级,而不是一个容器。

EDIT2:

我尝试了以下

public List<Resident> Residents => Households.SelectMany(h => h.Residents);

然而,这给了我错误:

  

错误CS1061:'列表&lt;家用&GT;”不包含'SelectMany'的定义,也没有扩展方法'SelectMany'接受类型'List&lt;的第一个参数家用&GT;”可以找到(你错过了使用指令或程序集引用吗?)

EDIT3:

抱歉,我以为我很清楚。家庭是一个有居民名单的班级,如下:

class Household {
    public List<Resident> Residents { get; }
}

4 个答案:

答案 0 :(得分:4)

您可以在C#6.0中执行此操作:

public List<Resident> Residents => Households.SelectMany(x => x.Residents).ToList(); 

您需要确保代码顶部有using System.Linq;以获取IEnumerable<T>扩展方法 - 其中包括SelectMany

答案 1 :(得分:3)

您的代码可以缩短为

var residents = Households.SelectMany(x => x.Residents).ToList(); 

residents将是IEnumerable<Resident>(或任何类型Residents,我假设其类型为Resident)。

如果您确实需要.ToList(),则可以在最后标记List<Resident>

答案 2 :(得分:2)

确保您使用的是System.Linq

using System.Linq;

无论居民是阵列还是列表&lt;&gt;

Households.SelectMany(x => x.Residents)都应该有效

答案 3 :(得分:1)

以下是我认为最短的:

public List<Resident> Residents() 
{
   return Households.SelectMany(x => x.Residents).ToList();
}
相关问题