【发布时间】:2012-05-30 18:51:21
【问题描述】:
我正在发现 C# 提供的用于处理集合的工具。
假设我有一个元素列表,并且我想检索最满足某个属性的元素。基本上是elements.Max(predicate),除了我对最佳元素的索引感兴趣。我想要索引而不是元素本身的原因是可能没有这样的元素,并且类型不可为空。
编写这样的函数是微不足道的,但我有兴趣使用 C# 提供的工具的表现力来获得简洁、清晰和最优(O(n))。
此时我有以下代码,它看起来仍然很混乱,并且对属性进行了两次评估。
List<foo> elements;
private int getBest(object x)
{
var indices = Enumerable.Range(0, elements.Count);
return indices.Aggregate(-1, (best, next) =>
(-1 == best || eval(x, elements[next]) > eval(x, elements[best])) ? next : best);
}
如何让这段代码变得更好?
附录:为了清楚起见,我没有把它放在代码中,但是如果eval() 低于某个阈值,则该元素将被丢弃。
【问题讨论】:
-
你应该可以缓存最好的分数和它的索引,所以你只需要做一次属性评估。
-
我想你会找到你的答案here
-
大概不可能有这样一个元素的唯一方法是让列表为空,还是你的意思是别的?
-
@AakashM:我编辑了有关您评论的问题。
标签: c# collections