在C#中有一个函数可以关联IEnumerable上的顺序值

Mik*_*e Q 2 c# linq

我有一个IEnumerable.我有一个自定义的Interval类,里面只有两个DateTimes.我想将IEnumerable转换为IEnumerable,其中n个DateTimes将枚举为n-1个间隔.

因此,如果我将1月1日,2月1日和3月1日作为DateTime,那么我想要两个时间间隔,1月1日/ 2月1日和2月1日/ 3月1日.

是否存在执行此操作的现有C#Linq函数.像下面的相关内容......

IEnumerable<Interval> intervals = dttms.Correlate<DateTime, Interval>((dttm1, dttm2) => new Interval(dttm1, dttm2));
Run Code Online (Sandbox Code Playgroud)

如果不是,我会自己滚动.

Joe*_*orn 6

public static IEnumerable<Timespan> Intervals(this IEnumerable<DateTime> source)
{
    DateTime last;
    bool firstFlag = true;
    foreach( DateTime current in source)
    {
       if (firstFlag)
       {
          last = current;
          firstFlag = false;
          continue;
       }

       yield return current - last;
       last = current;
    }
}
Run Code Online (Sandbox Code Playgroud)

要么

public class Interval {DateTime Start; DateTime End;}

public static IEnumerable<Interval> Intervals(this IEnumerable<DateTime> source)
{
    DateTime last;
    bool firstFlag = true;
    foreach( DateTime current in source)
    {
       if (firstFlag)
       {
          last = current;
          firstFlag = false;
          continue;
       }

       yield return new Interval {Start = last, End = current};
       last = current;
    }
}
Run Code Online (Sandbox Code Playgroud)

或者非常通用:

public static IEnumerable<U> Correlate<T,U>(this IEnumerable<T> source, Func<T,T,U> correlate)
{
    T last;
    bool firstFlag = true;
    foreach(T current in source)
    {
       if (firstFlag)
       {
          last = current;
          firstFlag = false;
          continue;
       }

       yield return correlate(last, current);
       last = current;
    }
}

var MyDateTimes = GetDateTimes(); 
var MyIntervals = MyDateTimes.Correlate((d1, d2) => new Interval {Start = d1, End = d2});
Run Code Online (Sandbox Code Playgroud)