Csharp/C#教程:累计日期范围分享


累计日期范围

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

例如:

(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()方法以按范围扩展现有项而不是添加新项(如果您希望用于累积日期范围的规则适用)

上述就是C#学习教程:累计日期范围分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1010714.html

(0)
上一篇 2021年12月29日
下一篇 2021年12月29日

精彩推荐