2010-08-03 147 views
4

我有以下代碼如何選擇另一個列表中包含的元素的不同列表?

new Dictionary<string,IEnumerable<Control>>() 
{ 
    { "view1", new Control[] { contents, building, view1 }}, 
    { "view2", new Control[] { contents, view2 }}, 
    { "view3", new Control[] { building, view3 } 
} 

我如何獲得所有不同的控件的列表使用LINQ?

結果應該是:

{ 
    contents, 
    building, 
    view2, 
    view3 
} 

回答

4

事情是這樣的:

var distinct = dictionary.Values.SelectMany(x => x) 
           .Distinct(); 

我決定把這個答案雖然具有等同一個馬克 - 這是啓發看到兩個方法。在我的方法中,我們採用了一系列值 - 每個值都是IEnumerable<Control>,並通過說:「對於每個值,我們只想通過這個價值獲得IEnumerable<Control>」。

Marc的方法採用了一系列的鍵/值對,並將其變平,表示「對於每一對,我們都想通過取對的值來獲得IEnumerable<Control>」。

在兩種情況下,需要SelectMany結果序列的序列,並且將它們合併爲一個單一的序列 - 這樣的結果之前Distinct()呼叫是有效的序列{ contents, building, view1, contents, view2, building, view3 }。然後Distinct調用將產生序列{ contents, building, view1, view2, view3 }

+0

好吧,如果你打算去*解釋*的東西; p我的推理是也許這對方法間接性較差(通過'ValueCollection'等)。但是兩者都可以工作。 – 2010-08-03 10:35:22

+0

謝謝大家, 由於我無法確定首先發布的是誰,所以我給了喬恩他的解釋。對不起馬克。 Podge – Podge 2010-08-03 10:41:12

6
var controls = yourDictionary.SelectMany(pair => pair.Value).Distinct(); 
+2

Marc Gravell vs Jon Skeet,這是一場戰鬥! :) – Andrey 2010-08-03 10:20:53

+2

@安德烈 - 即使*如果*我偶爾贏得奇怪的「戰鬥」,我想我們知道誰擁有戰爭; p – 2010-08-03 10:23:18

1
var distinctControls = dictionary.Values.SelectMany(x=>x).Distinct(); 
相關問題