我有一个(或将有一个)一个类,该类返回一个日期序列(基于重复模式)。序列可以有一个有限的结尾(#结果或结束日期)或是无限的。
我想做的是编写一个类,该类将这些枚举器的列表(加上开始日期)并将它们的序列“组合”为按日期排序的一个可枚举的输出序列。它必须处理结束(甚至不开始)的源枚举,还必须处理产生相同Date的多个源枚举。
所以我的问题是我怎样才能最好地实现这一目标?
更多信息(如果有帮助):
例如
如果我的RecurrencePatterns为:-
(1)“每月1日,至2017年7月4日止”;
(2)“每季度末,仅出现6次”
(3)“一年中的最后一天”
我从2017年1月1日开始,我希望输出为:-
2017年1月1日(1),
2017年2月1日(1),
2017年3月1日(1),
2017年3月31日(2),
2017年4月1日(1),
2017年5月1日(1),
2017年6月1日(1),
2017年6月30日(2)
2017年7月1日(1),[(1)-上一个枚举,因为next在其结束日期之后]
2017年9月30日(2),
2017年12月31日(2、3),[两个具有相同日期的事件]
2018年3月31日(2),
2018年6月30日(2)[(2)-上一个枚举,因为它仅产生6]
2018年12月31日(3),
2019年12月31日(3),
2020年12月31日(3),
等等
递归模式类的实际输出可能是某种EventInfo类,其中包含Source和Date。
“合并”枚举器的输出将类似,但是如果多个Recurrence EventInfo具有相同的日期,则它将输出具有单个Date的单个EventInfo和返回该日期的源列表。
最佳答案
如果要返回重复项,则应在MoreLINQ中使用SortedMerge
;如果不需要重复项,则应使用OrderedMerge
。
如果您不想安装NuGet软件包,或者没有替代适合您的需要,请按照下面的方式编写它。
static IEnumerable<DateTime> CombineDateTimes(IEnumerable<IEnumerable<DateTime>> list) {
// keep track of which enumerators are still available
var eligible = list.Select(l => l.GetEnumerator()).Where(l => l.MoveNext()).ToList();
while (eligible.Any()) {
// find the lowest enumerator
IEnumerator<DateTime> min = eligible.First();
foreach (var l in eligible.Skip(1)) {
if (l.Current < min.Current) {
min = l;
}
}
// here is our lowest
yield return min.Current;
if (!min.MoveNext()) {
// if the enumerator ends,
// remove it from the list of eligible enumerators
eligible = eligible.Remove(min);
}
}
}
关于c# - 如何创建一个特殊的“组合”枚举器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41769399/