2012-02-09 60 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()使他們獨一無二。

相關問題