2009-07-08 131 views
0

選擇正確的價值觀考慮下面的類層次結構:LINQ - 從嵌套集合

public class Foo 
{ 
public string Name { get; set; } 
public int Value { get; set; } 
} 
public class Bar 
{ 
public string Name { get; set; } 
public IEnumerable<Foo> TheFoo { get; set; } 
} 

public class Host 
{ 
    public void Go() 
    { 
    IEnumerable<Bar> allBar = //Build up some large list 
    //Get Dictionary<Bar, Foo> with max foo value 
    } 
} 

我想有什麼用Linq2Objects做的是得到一個KeyValuePair,其中每個酒吧的allBBar集合中,我們選擇與富最大值屬性。這可以通過單個LINQ語句輕鬆完成嗎?

回答

2

當然,雖然我的首選解決方案使用MaxByMoreLINQ

var query = allBar.ToDictionary(x => x, // Key 
           x => x.TheFoo.MaxBy(f => f.Value)); 

注意,這將是不可預料的,如果TheFoo是空的任何Bar實例。

+0

而且沒有MaxBy選項? – 2009-07-08 21:21:03

0

只是爲了增加Jon對MaxBy的評論,如果你沒有foos,你可以做一個OrderByDescending,然後使用FirstOrDefault來獲取Max元素。如果集合是空的,它只會返回null而不是「梨形」

var foobars = bars.ToDictionary(bar => bar, 
           bar => bar.TheFoo.OrderByDescending(foo => foo.Value).FirstOrDefault()); 

我不認爲這不會像MaxBy那樣高效,但它在空集合的情況下會更強大。

1

用骨料代替排序依據,以便找出最大的Foo是O(n)的另一種方式,而不是爲O(n log n)的:

var query = allBar.ToDictionary(
    bar => bar, 
    bar => bar.TheFoo.Aggregate(
     null, 
     (max, foo) => (max == null || foo.Value > max.Value) ? foo : max));