2016-03-16 61 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

是的,只是意識到我沒有把它拉出來 –