这是非LINQ方式。它并不比它的 LINQ 对应物短,但它更高效,因为它不像大多数 LINQ 解决方案那样进行排序,如果集合很大,这可能会变得昂贵。
dtb 的 MinBy 解决方案是一个很好的解决方案,但它需要一个外部库。我确实非常喜欢 LINQ,但有时您应该提醒自己,带有一些局部变量的 foreach 循环不是过时的或错误的。
CustomStruct Min(Dictionary<double, CustomStruct> input)
{
CustomStruct lret = default(CustomStruct);
double lastSum = double.MaxValue;
foreach (var kvp in input)
{
var other = kvp.Value;
var newSum = other.value1 + other.value2;
if (newSum < lastSum)
{
lastSum = newSum;
lret = other;
}
}
return lret;
}
如果您想在不使用外部库的情况下使用 LINQ 方法,您可以像这样创建自己的 MinBy:
public static class Extensions
{
public static T MinBy<T>(this IEnumerable<T> coll, Func<T,double> criteria)
{
T lret = default(T);
double last = double.MaxValue;
foreach (var v in coll)
{
var newLast = criteria(v);
if (newLast < last)
{
last = newLast;
lret = v;
}
}
return lret;
}
}
它不如第一个高效,但它可以完成工作,并且比第一个更可重用和可组合。您的 Aggregate 解决方案具有创新性,但需要重新计算与当前最佳匹配比较的每个项目的当前最佳匹配的总和,因为您在聚合调用之间携带的状态不足。