C#LINQ,如果未找到(时间),请选择上一个/复制之前的结果

时间:2018-04-05 12:01:00

标签: c# linq time group-by

我们说我有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;
}

现在使用LINQGroupBy我获得了按RoundedTime分组的所有结果。没问题,但是,我想检查每分钟是否有结果(因此对于一小时的数据,GroupBy应该返回60个结果)。

优选地,当LINQ结果中缺少一分钟时,我想使用之前的值(假设缺少30分钟,请填写分钟数据29) )。

现在我想知道LINQ是否可以实现这一点。

1 个答案:

答案 0 :(得分:3)

我想你想实现这个目标:

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

这只是一个小小的帮助,你需要修改代码,让它与你的代码一起工作。 AND:我猜有更多高效的方式