在for循环中,我运行以下代码:
IEnumerable<KeyValuePair<DateTime, double>> avrPrefMinute = d_averagesPerMinute.Where(n => n.Key == minuteAverage.Key.Subtract(new TimeSpan(0, i, 0)));
此循环将始终运行20次,但是当我使用VS2012 Analyzer检查应用程序时,它告诉我,它表现不佳。
有人可以告诉我如何使用更快的解决方案来重构这一点。我已经阅读了关于谓词的内容,但我无法将它们弄清楚。
答案 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_averagesPerMinute
是Dictionary<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);
在我看来,这更清楚了。