0

考虑以下类层次结构:

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 集合中的每个 Bar 我们选择具有最大值属性的 Foo 。这可以在单个 LINQ 语句中轻松完成吗?

4

3 回答 3

2

当然,尽管我首选的解决方案MaxBy来自MoreLINQ

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

请注意,如果任何实例TheFoo为空,这将变成梨形。Bar

于 2009-07-08T21:20:24.150 回答
1

另一种使用 Aggregate 而不是 OrderBy 的方法,以便找出最大 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));
于 2009-07-10T14:39:26.433 回答
0

只是为了添加 Jon 的关于 MaxBy 变成梨形的评论,如果你没有 foos,你可以做一个 OrderByDescending 然后使用 FirstOrDefault 来获取 Max 元素。如果集合为空,它只会返回 null 而不是“梨形”

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

我认为这不会像 MaxBy 那样有效,但在空集合的情况下它会更健壮。

于 2009-07-08T21:33:05.513 回答