我有一个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)
如果不是,我会自己滚动.
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)