我有以下几点:

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/

10-10 14:02