C# LINQ, если (время) не найдено, выберите предыдущий / скопируйте предыдущий результат

Допустим, у меня есть List<Type> и Type со свойствами:

public DateTime OriginalDateTime { get; set; }
public double RoundedTime { get; }
public int MyValue { get; set; }

И этот класс содержит конструктор:

public Match(DateTimeOffset dateTime, int bid, int ask, int volume)
{
            DateTime = dateTime;
            RoundedTime = Math.Round(Math.Ceiling(dateTime.ToTimeStamp() / 60) * 60); // Round to nearest minute
            Bid = bid;
            Ask = ask;
            Volume = volume;
}

Сейчас использую LINQ а также GroupBy Я получаю все результаты, сгруппированные по RoundedTime, Нет проблем, однако, я хочу проверить, есть ли результат для каждой минуты (так что для часа данных, GroupBy должен вернуть 60 результатов).

Предпочтительно, когда минута отсутствует LINQ В результате я хотел бы использовать предыдущее значение (допустим, что минута 30 отсутствует, заполните ее данными минуты 29).

Теперь мне интересно, если это вообще возможно с LINQ,

1 ответ

Решение

Я думаю, вы хотите добиться этого:

IEnumerable<IGrouping<int, MyType>> mygrouping = new List<MyType>().GroupBy(x => x.Key); // this is your grouped list

var allData = Enumerable.Range(0, 60) // here you take 60 values (0-59)
            .Select(
              actualKey =>
              {
                  var p = mygrouping.SingleOrDefault(y => y.Key == actualKey);
                  int counter = actualKey;
                  while (p == null && counter >= 0) // as long as the value is null and the counter is greater or equal to 0
                      p = mygrouping.SingleOrDefault(y => y.Key == counter--);
                  return new KeyValuePair<int, IEnumerable<MyType>>(actualKey, p.Select(v => v)); // return the data of the last value
              });

это всего лишь небольшая помощь, вам нужно изменить код, чтобы он работал с вашим, я думаю. И: есть более производительные способы, я думаю

Другие вопросы по тегам