累计日期范围

我收到日期范围列表作为输入。 其中一些是重叠的 ,一些是相邻的 。 是否有任何集合会累积传入的日期范围?

例如:

(2018/01/01, 2018/01/02), (2018/02/15, 2018/03/21), (2018/01/10, 2018/01/10), (2018/01/03, 2018/01/09) 

结果:

 (2018/01/01, 2018/01/10), // 1st, 3rd, 4th lines combined (2018/02/15, 2018/03/21) // 2nd line 

没有标准库中没有这样的集合。 但是,您可以为它实现自定义的简单方法 ; 假设句点Tuple

 private static IEnumerable> Accumulate( IEnumerable> source) { var data = source .OrderBy(date => date.Item1) .ThenByDescending(date => date.Item2); DateTime left = DateTime.MinValue; // make compiler be happy: initialization DateTime right = DateTime.MinValue; // -/- bool first = true; foreach (var item in data) { if (first) { left = item.Item1; right = item.Item2; first = false; } else if (right.AddDays(1) >= item.Item1) // can be combined; keep on combining right = item.Item2 > right ? item.Item2 : right; else { // can't be combined: return previous chunk yield return Tuple.Create(left, right); // start a new chunk left = item.Item1; right = item.Item2; } } // if we have a very last chunk to return, do it if (!first) yield return Tuple.Create(left, right); } 

然后

  Tuple[] test = new Tuple[] { Tuple.Create(new DateTime(2018, 01, 01), new DateTime(2018, 01, 02)), Tuple.Create(new DateTime(2018, 02, 15), new DateTime(2018, 03, 21)), Tuple.Create(new DateTime(2018, 01, 10), new DateTime(2018, 01, 10)), Tuple.Create(new DateTime(2018, 01, 03), new DateTime(2018, 01, 09)), }; var result = Accumulate(test) .ToList(); string report = string.Join("," + Environment.NewLine, result .Select(item => $"({item.Item1:yyyy'/'MM'/'dd}, {item.Item2:yyyy'/'MM'/'dd})")); Console.Write(report); 

结果

 (2018/01/01, 2018/01/10), (2018/02/15, 2018/03/21) 

我不认为c#中有一个函数或容器可以自动执行此操作,但当然您可以扩展某种类型的集合来实现此目的。 例如,使用一个简单的List并仅覆盖Add()方法以按范围扩展现有项而不是添加新项(如果您希望用于累积日期范围的规则适用)