2013-01-23 49 views
1

我有兩個大小相等的列表。兩者都包含數字。第一個列表生成,第二個列表是靜態的。由於我有很多生成的列表,我想知道哪一個是最好的。對我來說,最好的名單是最符合參考的名單。因此,我計算每個位置的差異並加起來。構建總和比循環更有效的方法

下面是代碼:

/// <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; 
} 

是否有可能是一個更優雅,但更重要,更有效的方式來獲得所需的款項?

在此先感謝!

+0

如果要比較的列表數量很大,那麼因爲您只需要最佳匹配,您可以使用「最佳沙發」作爲參數的差異,並在當前列表有較大差異時停止比較。 –

回答

5

如下您可以做同樣的LINQ:

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

這可以被認爲是更優雅,但它不能更高效,你已經擁有。它也可以與任何類型的IEnumerable(所以你不需要特別需要IList)一起工作,但在你的情況下這沒有任何實際重要性。

只要差異的運行總和變得大於迄今爲止所見的最小總和,您也可以拒絕histDates,如果您掌握了此信息。

+0

關於僅使用總和 - 是不是他總結每個單獨記錄的絕對個體差異? {1,5}和{2,4}都有6作爲總和,但會導致2的差異,對嗎? –

+0

@ C.Evenhuis:當然。啞! – Jon

+0

@Jon +1 for Zip –

0

你可以做更多的優雅與LINQ,但它不會是更有效的...如果你可以計算的款項,同時增加的項目你可能會得到一個邊緣列表...

0

我不以爲我想garantee efficiancy的任何直接改良效果,因爲我現在不能測試,但這樣至少看起來更好:

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

return combination.Select((t, i) => Math.Abs(t - histDates[i].Value)).Sum(); 
1

這是可能的,而無需使用列表。而不是填寫你的兩個列表,你只想得到單個列表的每個值的總和。 IList組合變成int combinationSum

爲histDates列表做同樣的事情。

然後減去這兩個值。在這種情況下不需要循環。

+0

如果一個列表包含1和5,另一個列表包含2和4,那麼它們將被視爲相等,對吧?在他的例子中,他總結了每個元素的絕對差異。 –

+1

他需要獲得當然值的數量。在每個和上增加的整數。如果元素數量相同,則可以計算絕對差值,否則返回Math.MaxValue –

+1

由於順序很重要,因此此方法不相同。 – Toby

相關問題