2016-03-16 63 views
1

我有家庭清单,每个家庭都包含居民清单。我想要一个函数返回所有家庭所有居民的列表。使用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); 

然而,这给我的错误:

error CS1061: 'List< Household>' does not contain a definition for 'SelectMany' and no extension method 'SelectMany' accepting a first argument of type 'List< Household>' could be found (are you missing a using directive or an assembly reference?)

EDIT3:

对不起,我以为我很清楚。家庭是有居民的名单一类,像这样:

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

我不明白你对SelectMany的评论。你为什么不能'Households.SelectMany(x => x.Residents)'? –

+2

如果不是列表,Hoseholds是什么类型?你不能在'之前做'.ToList()'吗?或者你忘了添加'using'语句,这就是为什么你看不到'SelectMany'? – Niklas

+1

正如@KooKiz指出的那样,从你的代码看起来你可以简单地做SelectMany。 –

回答

3

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

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

你需要确保你在你的代码的顶部有一个using System.Linq;得到IEnumerable<T>扩展方法 - 包括SelectMany

+0

这是在他们的答案中提到'使用System.Linq'的唯一答案,所以我会接受这个答案。 – gartenriese

2

你的代码可以被缩短到

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

residents那么将是一个IEnumerable<Resident>(或任何类型Residents是,我已经假设它是一种称为Resident的类型)。

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

1

确保您使用System.Linq的

using System.Linq;

Households.SelectMany(x => x.Residents)应该工作无论居民<>

1

以下是最短的,我认为一个数组或List:

public List<Resident> Residents() 
{ 
    return Households.SelectMany(x => x.Residents).ToList(); 
} 
+1

你不需要'AddRange',实际上不会因为'list'在你的代码中不存在而编译。 – Jamiec

+0

是的,只是意识到我没有把它拉出来 –