请考虑以下类层次结构:
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语句中轻松完成此操作吗?
使用Aggregate而不是OrderBy的另一种方法,以便找出最大Foo是O(n)而不是O(n log n):
Bar
只是为了补充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那样有效,但是在集合为空的情况下会更强大。