当前位置: 首页 > 编程语言 > C#

对连续日期进行分组分享

时间:2023-04-10 15:29:29 C#

对连续日期进行分组我有一个Listdates;我有一堂课:classNonWorkingDay{publicDateTimeStart;公共int天;}我试图找出一种干净的方法来对它们进行分组。publicListGetContiguousDates(Listdates){}注意:如果周五有一个NWD而下一个是周一,则应将它们分组。周末不考虑。例如,如果我有September32013September202013September232013September242013September302013October12013输出将是:Start=September32013,Days=1Start=September202013skiend=kiStart=September302013,Days=2有没有办法做到这一点(没有一堆计数器变量)并使用.Select或.Where等。谢谢所以我们将从这个通用迭代器函数开始。它采用一个序列和一个谓词,谓词采用两个项目并返回一个布尔值。它将读取源中的项目,项目及其前身将根据谓词返回true,下一个项目将在“下一个集合”中。如果返回false,则前一组已满,下一组已开始。publicstaticIEnumerable>GroupWhile(thisIEnumerablesource,Funcpredicate){using(variterator=source.GetEnumerator()){if(!iterator.MoveNext())yieldbreak;列表currentGroup=newList(){iterator.Current}while(iterator.MoveNext()){if(predicate(currentGroup.Last(),iterator.Current))currentGroup.Add(iterator.Current);else{yieldreturncurrentGroup;currentGroup=newList(){iterator.Current};}}yieldreturncurrentGroup;我们还需要这个简单的辅助方法,它可以根据日期获取下一个工作日。如果您想整合假期,从微不足道到非常困难,但这就是逻辑所在。publicstaticDateTimeGetNextWorkDay(DateTimedate){DateTimenext=date.AddDays(1);如果(next.DayOfWeek==DayOfWeek.Saturday)返回next.AddDays(2);elseif(next.DayOfWeek==DayOfWeek.Sunday)返回next.AddDays(1);否则返回下一个;现在把它们放在一起。首先,我们订购的日子。(如果您确保它们始终按顺序排列,则可以删除该部分。)然后我们将连续的项目分组,每个项目是前一个项目的下一个工作日。然后我们需要做的就是将连续日期的IEnumerable转换为NonWorkingDay。为此,开始日期是第一个日期,天数是序列的计数。虽然通常同时使用First和Count会迭代源序列两次,但我们碰巧知道GroupWhile返回的序列实际上是一个List底层,因此迭代多次不是问题,并且得到Count甚至是O(1).以上就是《C#学习教程:分组连续数据分享》的全部内容。如果对你有用,需要进一步了解C#学习教程,希望你多多关注——=>GetNextWorkDay(previous).Date==next.Date).Select(group=>newNonWorkingDay{Start=group.First(),Days=group.Count(),});}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: