Linq — запрос сравнивает с предыдущей записью

#c# #linq

#c# #linq

Вопрос:

Этот запрос просматривает запись перед ней и вычитает время, чтобы вычислить общее количество времени. Однако, когда оценивается первая запись, она выдает ошибку в третьей строке после вычитания. Индекс выходит за рамки. Когда я удаляю Sum (), ошибка исчезает, но мне нужна сумма эффективно.

 var allRecorded = queryable.Where(x => x.DataId== Id);
var dataFiltered = allRecorded.Where(x => x.DataValue >= lowerThreshold amp;amp; x.DataValue < upperThreshold);
var sumOfExactTimes = dataFiltered.Select(times => (times.EndTime - allRecorded.Where(time2 => time2.EndTime < times.EndTime).Select(x => (DateTime?) x.EndTime).Max()).GetValueOrDefault().TotalMinutes).Sum();
  

Есть ли что-то еще, чего мне не хватает?

Ответ №1:

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

Однако этот запрос можно было бы значительно упростить. Было бы проще сначала отсортировать его, а затем объединить, чтобы найти различия.

 var data = queryable
    .Where(item => item.DataId == id
                amp;amp; item.DataValue >= lowerThreshold
                amp;amp; item.DataValue <  upperThreshold)
    .OrderBy(item => item.EndTime)
    .ToList();
var sumOfExactTimes = data.Skip(1)
    .Aggregate(
        Tuple.Create(data.First(), 0.0), // [1] Prev Item [2] Result
        (seed, item) =>
            Tuple.Create(
                item,
                seed.Item2   (item.EndTime - seed.Item1.EndTime).TotalMinutes),
        result => result.Item2);