2012-02-09 56 views
0
class Foo() 
{ 
    public Bar [] bars; 
} 

class Bar() 
{ 
    public string name; 
    public int id; 
} 

我有一个IEnumerable<Foo>,我想构建一个IEnumerable<Bar>包含其中包含每一个独特的酒吧(由ID排序...但我可以处理一部分我自己)。使用LINQ构建层次分明,有序的基于属性的对象

我觉得这是LINQ的任务类型..但我似乎无法弄清楚如何使它发生。

举个例子,如果我有:

foo[0] => bars { { name = "one", id = 1 }, { name = "two", id = 2 }, { name = "three", id = 3 }, 
foo[1] => bars { { name = "four", id = 4 }, { name = "four", id = 4 } 

我想我的LINQ语句返回:

{ name = "one", id = 1 }, { name = "two", id = 2 }, { name = "three", id = 3 }, { name = "four", id = 4 } 

回答

4

如果您Bar类推翻EqualsGetHashCode,这将是非常简单的:

var values = foo.SelectMany(f => f.bars) 
       .Distinct() 
       .OrderBy(b => b.id); 

没有平等的实现,你需要创建自己的IEqualityComparer<Foo>通入Distinct方法。

如果你只需要关心id,使他们不同,你可以使用从MoreLINQDistinctBy,让您的生活更简单:

var values = foo.SelectMany(f => f.bars) 
       .DistinctBy(b => b.id) 
       .OrderBy(b => b.id); 

或者你可以使用匿名类型作为一个快速黑客获得一个相等比较在这两个值,仍与MoreLINQ:

var values = foo.SelectMany(f => f.bars) 
       .DistinctBy(b => new { b.id, b.name }) 
       .OrderBy(b => b.id); 

几乎可以肯定将是更好地落实平等Bar虽然:)

0
Foos.SelectMany(foo => foo.bars).OrderBy(bar => bar.id).Distinct() 
0

使用SelectMany()Concat()给孩子们组合成一个和Distinct()使他们独一无二。

相关问题