1

同じサイズのリストが2つあります。どちらにも数字が含まれています。最初のリストが生成され、2番目のリストは静的です。生成されたリストがたくさんあるので、どれが最適かを調べたいと思います。私にとって最良のリストは、参照に最も等しいものです。したがって、各位置での差を計算して合計します。

コードは次のとおりです。

/// <summary>
/// Calculates a measure based on that the quality of a match can be evaluated
/// </summary>
/// <param name="Combination"></param>
/// <param name="histDates"></param>
/// <returns>fitting value</returns>
private static decimal getMatchFitting(IList<decimal> combination, IList<MyClass> histDates)
{
    decimal fitting = 0;
    if (combination.Count != histDates.Count)
    {
        return decimal.MaxValue;
    }

    //loop through all values, compare and add up the result
    for (int i = 0; i < combination.Count; i++)
    {
        fitting += Math.Abs(combination[i] - histDates[i].Value);
    }
    return fitting;
}

希望する金額を取得するための、よりエレガントでありながらより重要で効率的な方法はありますか?

前もって感謝します!

4

4 に答える 4

5

LINQでも次のように同じことができます。

return histDates.Zip(combination, (x, y) => Math.Abs(x.Value - y)).Sum();

これはよりエレガントと見なすことができますが、すでに持っているものよりも効率的ではありません。また、どのタイプでも機能しますIEnumerable(したがって、特に必要はありませんIList)が、状況において実際的な重要性はありません。

histDatesこの情報が手元にある場合は、差の現在の合計がこれまでに見られた最小の合計よりも大きくなるとすぐに拒否することもできます。

于 2013-01-23T13:04:06.380 に答える
1

これは、リストを使用せずに可能です。2つのリストを埋める代わりに、1つのリストの各値の合計が必要です。たとえば、IListの組み合わせintcombinationSumになります。

histDatesリストについても同じようにします。

次に、これら2つの値を減算します。この場合、ループは必要ありません。

于 2013-01-23T13:08:00.277 に答える
0

LINQを使用すると、よりエレガントに実行できますが、効率は向上しません...リストにアイテムを追加しながら合計を計算できる場合は、優位に立つ可能性があります...

于 2013-01-23T13:05:53.710 に答える
0

現時点ではテストできないため、効率の直接的な改善を保証したいとは思いませんが、少なくともこれは見栄えがします。

if (combination.Count != histDates.Count)
                return decimal.MaxValue;

return combination.Select((t, i) => Math.Abs(t - histDates[i].Value)).Sum();
于 2013-01-23T13:05:58.217 に答える