gpt4 book ai didi

c# - 合并重叠的时间间隔?

转载 作者:太空狗 更新时间:2023-10-29 17:36:00 36 4
gpt4 key购买 nike

我有以下内容:

public class Interval
{
DateTime Start;
DateTime End;
}

我有一个 List<Interval>包含多个间隔的对象。我正在努力实现以下目标(我使用数字使其易于理解):

[(1, 5), (2, 4), (3, 6)] --->  [(1,6)]
[(1, 3), (2, 4), (5, 8)] ---> [(1, 4), (5,8)]

我目前在 Python 中按如下方式执行此操作:

def merge(times):
saved = list(times[0])
for st, en in sorted([sorted(t) for t in times]):
if st <= saved[1]:
saved[1] = max(saved[1], en)
else:
yield tuple(saved)
saved[0] = st
saved[1] = en
yield tuple(saved)

但我正在尝试在 C# 中实现相同的目标(LINQ 最好但可选)。关于如何有效地执行此操作的任何建议?

最佳答案

这是一个使用 yield return 的版本 - 我发现它比执行 Aggregate 查询更容易阅读,尽管它仍然是惰性计算。这假设您已经订购了列表,如果没有,只需添加该步骤。

IEnumerable<Interval> MergeOverlappingIntervals(IEnumerable<Interval> intervals)
{
var accumulator = intervals.First();
intervals = intervals.Skip(1);

foreach(var interval in intervals)
{
if ( interval.Start <= accumulator.End )
{
accumulator = Combine(accumulator, interval);
}
else
{
yield return accumulator;
accumulator = interval;
}
}

yield return accumulator;
}

Interval Combine(Interval start, Interval end)
{
return new Interval
{
Start = start.Start,
End = Max(start.End, end.End),
};
}

private static DateTime Max(DateTime left, DateTime right)
{
return (left > right) ? left : right;
}

关于c# - 合并重叠的时间间隔?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11480031/

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