Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance Linq性能差_Performance_Linq_Predicate - Fatal编程技术网

Performance Linq性能差

Performance Linq性能差,performance,linq,predicate,Performance,Linq,Predicate,在for循环中,我运行以下代码: IEnumerable<KeyValuePair<DateTime, double>> avrPrefMinute = d_averagesPerMinute.Where(n => n.Key == minuteAverage.Key.Subtract(new TimeSpan(0, i, 0))); IEnumerable avrPrefMinute=d_average精子分钟数,其中(n=>n.Key==minuteAvera

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

IEnumerable<KeyValuePair<DateTime, double>> avrPrefMinute = d_averagesPerMinute.Where(n => n.Key == minuteAverage.Key.Subtract(new TimeSpan(0, i, 0)));
IEnumerable avrPrefMinute=d_average精子分钟数,其中(n=>n.Key==minuteAverage.Key.Subtract(新时间跨度(0,i,0));
此循环将始终运行20次,但当我使用VS2012 Analyzer检查应用程序时,它告诉我,它的性能很差


有人能告诉我如何用一个更快速的解决方案重构它吗。我读过关于谓词的书,但我不能正确理解它们。

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

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

但是,这完全是基于您提供的详细信息。如果看不到这是一部分的整个循环,也看不到具体性能的细节,就很难给出完整的建议。

好吧,在我看来,它就像
分钟平均数.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
是一个
字典
,您可以只进行查找:

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);

在我看来,这更清楚。

性能差吗?有多穷?这真的是个问题吗?
d_平均精子分钟数是多少?您要查找多少项?它运行20次,需要多长时间?20次循环运行的频率是多少?你真的需要它来加快速度吗?这么多的问题,没有足够的信息!显示循环。什么是
分钟平均值
?因为
minuteAverage.Key.Subtract(新的时间跨度(0,i,0))总是相同的,所以您可以使用变量。请注意,LINQ查询只不过是另一个循环。该死的Skeet!来到这里,给出比我更好的答案!(+1)