これが非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;
}
extern ライブラリを使用せずに 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 を使用したソリューションは革新的ですが、集約呼び出し間で十分な状態を保持していないため、現在の最適一致が比較されるすべての項目について、現在の最適一致の合計を再計算する必要があります。