林克表现不佳

时间:2014-07-23 09:02:25

标签: performance linq predicate

在for循环中,我运行以下代码:

IEnumerable<KeyValuePair<DateTime, double>> avrPrefMinute = d_averagesPerMinute.Where(n => n.Key == minuteAverage.Key.Subtract(new TimeSpan(0, i, 0)));

此循环将始终运行20次,但是当我使用VS2012 Analyzer检查应用程序时,它告诉我,它表现不佳。

enter image description here

有人可以告诉我如何使用更快的解决方案来重构这一点。我已经阅读了关于谓词的内容,但我无法将它们弄清楚。

2 个答案:

答案 0 :(得分:1)

我建议您在where之前的变量中执行减法。这样,您只执行一次该操作,而不是每次执行评估:

var key = minuteAverage.Key.Subtract(new TimeSpan(0, i, 0));
IEnumerable<KeyValuePair<DateTime, double>> avrPrefMinute = d_averagesPerMinute.Where(n => n.Key == key);

但是,这完全基于您提供的详细信息。如果没有看到它所属的整个循环,并且详细了解您所看到的性能,则很难提供完整的建议。

答案 1 :(得分:1)

嗯,我认为minuteAverage.Key.Subtract(new TimeSpan(0, i, 0))不依赖于循环中的任何内容。所以提取:

var target = minuteAverage.Key.Subtract(new TimeSpan(0, i, 0));
var avrPrefMinute = d_averagesPerMinute.Where(n => n.Key == target);

当然,如果d_averagesPerMinuteDictionary<DateTime, double>,您可以改为查找:

var target = minuteAverage.Key.Subtract(new TimeSpan(0, i, 0));
double result;
if (d_averagesPerMinute.TryGetValue(target, out result))
{
    // Use result
}
else
{
    // No result found
}

另外,我实际建议不是

minuteAverage.Key.Subtract(new TimeSpan(0, i, 0))

你使用

minuteAverage.Key.AddMinutes(-i);

在我看来,这更清楚了。