gpt4 book ai didi

c# - 如何创建特殊的 'combining' 枚举器

转载 作者:太空宇宙 更新时间:2023-11-03 23:04:35 25 4
gpt4 key购买 nike

我有(或将有)一个返回日期序列的类(基于重复模式)。该序列可能有一个有限的结尾(# 个结果或一个结束日期)或无限的。

我想做的是编写一个类,该类将采用此类枚举器的列表(加上开始日期)并将它们的序列“组合”成一个按日期排序的可枚举输出序列。它必须处理结束(或什至没有开始)的源枚举以及产生相同日期的多个源枚举。

所以我的问题是我怎样才能最好地实现这一点?

更多信息(如果有帮助):
例如如果我有以下 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) - 最后一次枚举,因为下一次枚举在其结束日期之后]
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),等等

Recurrence 模式类的实际输出可能是某种包含 Source 和 Date 的 EventInfo 类。“组合”枚举器的输出将是相似的,但如果多个 Recurrence EventInfo 具有相同的日期,它将输出一个具有单个日期的单个 EventInfo 和返回该日期的源列表。

最佳答案

你应该使用 SortedMerge在 MoreLINQ 中,如果您希望返回重复项,或 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# - 如何创建特殊的 'combining' 枚举器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41769399/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com