2010-08-03 112 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(); 
相关问题