LINQ-从嵌套集合中选择正确的值

问题描述 投票:0回答:3

请考虑以下类层次结构:

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,我们选择具有最大Value属性的Foo。可以在一个LINQ语句中轻松完成此操作吗?

c# linq linq-to-objects
3个回答
2
投票

当然,尽管我的首选解决方案使用的是MaxBy中的MaxBy

MoreLINQ

请注意,如果对于任何var query = allBar.ToDictionary(x => x, // Key x => x.TheFoo.MaxBy(f => f.Value)); 实例,TheFoo为空,它将变成梨形。


1
投票

使用Aggregate而不是OrderBy的另一种方法,以便找出最大Foo是O(n)而不是O(n log n):

Bar

0
投票

只是为了补充Jon关于MaxBy如果没有foos会变成梨形的评论,您可以执行OrderByDescending,然后使用FirstOrDefault获取Max元素。如果集合为空,则仅返回null而不是“ pearshaped”

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

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

© www.soinside.com 2019 - 2024. All rights reserved.