2009-07-08 115 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));