构建总和比循环更有效的方法

我有两个大小相同的列表。 两者都包含数字。 生成第一个列表,第二个列表是静态的。 由于我有许多生成的列表,我想找出哪一个是最好的。 对我来说,最好的清单是最接近参考的清单。 因此,我计算每个位置的差异并将其加起来。

这是代码:

///  /// Calculates a measure based on that the quality of a match can be evaluated ///  ///  ///  /// fitting value private static decimal getMatchFitting(IList combination, IList 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; } 

是否有更优雅但更重要,更有效的方式来获得所需的金额?

提前致谢!

您可以使用LINQ执行相同操作,如下所示:

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

这可以被认为更优雅,但它不能比你已经拥有的更有效。 它也适用于任何类型的IEnumerable (因此您不需要专门的IList ),但这在您的情况下没有任何实际意义。

如果差异的运行总和变得大于到目前为止看到的最小总和,如果手头有这些信息,您也可以拒绝histDates

这可以不使用列表。 您只想获得单个列表的每个值的总和,而不是填充您的两个列表,例如IList组合变为int combinationSum

对histDates列表执行相同操作。

然后减去这两个值。 在这种情况下不需要循环。

您可以使用LINQ做得更优雅,但效率不会更高……如果您可以在将项目添加到列表时计算总和,那么您可能会获得优势……

我不认为我想保证任何效率的直接提高,因为我现在无法测试它,但这至少看起来更好:

 if (combination.Count != histDates.Count) return decimal.MaxValue; return combination.Select((t, i) => Math.Abs(t - histDates[i].Value)).Sum();