Плохая производительность Linq

Вопрос:

В цикле for я запускаю следующий код:

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

Этот цикл всегда будет работать 20 раз, но когда я проверяю приложение с помощью анализатора VS2012, он говорит мне, что он работает плохо.

enter image description here

Может кто-то сказать мне, как реорганизовать это с более быстрым решением. Я читал о предикатах, но я не могу их исправить.

Лучший ответ:

Ну, мне кажется, что 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);

Это яснее, на мой взгляд.

Ответ №1

Я бы рекомендовал вам выполнить вычитание в переменной до того, где. Таким образом, вы выполняете это действие только один раз, а не по каждому, где оценивается:

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

Однако это чисто основано на деталях, которые вы предоставили. Не видя всего цикла, в котором это входит, и подробно о том, какую производительность вы видите, трудно дать полный совет.

Оцените статью
TechArks.Ru
Добавить комментарий