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
});
это всего лишь небольшая помощь, вам нужно изменить код, чтобы он работал с вашим, я думаю. И: есть более производительные способы, я думаю