gpt4 book ai didi

c# - 将一段时间拆分成多个时间段

转载 作者:太空狗 更新时间:2023-10-29 23:25:19 32 4
gpt4 key购买 nike

如果我有一个时间段,比如说 DateFromDateTo 并且我有一个日期列表,这些日期将是拆分日期。例如:

DateTime dateFrom = new DateTime(2012, 1, 1);
DateTime dateTo = new DateTime(2012, 12, 31);

List<DateTime> splitDates = new List<DateTime>
{
new DateTime(2012,2,1),
new DateTime(2012,5,1),
new DateTime(2012,7,1),
new DateTime(2012,11,1),
};

List<Tuple<DateTime, DateTime>> periods = SplitDatePeriod(dateFrom, dateTo, splitDates);

我希望结果是句点列表,因此对于前面的示例,结果应该是:

(01/01/2012 - 01/02/2012)
(02/02/2012 - 01/05/2012)
(02/05/2012 - 01/07/2012)
(02/07/2012 - 01/11/2012)
(02/11/2012 - 31/12/2012)

我已经写了一个方法来做到这一点:

List<Tuple<DateTime, DateTime>> SplitDatePeriod(DateTime dateFrom, DateTime dateTo, List<DateTime> splitDates)
{
var resultDates = new List<Tuple<DateTime, DateTime>>();

// sort split dates
List<DateTime> _splitDates = splitDates.OrderBy(d => d.Date).ToList();

DateTime _curDate = dateFrom.Date;
for (int i = 0; i <= _splitDates.Count; ++i)
{
DateTime d = (i < _splitDates.Count) ? _splitDates[i] : dateTo;

// skip dates out of range
if (d.Date < dateFrom.Date || d.Date > dateTo.Date)
continue;

resultDates.Add(Tuple.Create(_curDate, d));

_curDate = d.AddDays(1);
}
return resultDates;
}

问题
它看起来很难看,有没有更简洁、更短的方法来做到这一点?也许使用 Linq?

最佳答案

这是一个可以工作并处理一些边缘情况的方法:

var realDates = splitDates
.Where(d => d > dateFrom && d < dateTo)
.Concat(new List<DateTime>() {dateFrom.AddDays(-1), dateTo})
.Select(d => d.Date)
.Distinct()
.OrderBy(d => d)
.ToList();

// now we have (start - 1) -- split1 -- split2 -- split3 -- end
// we zip it against split1 -- split2 -- split3 -- end
// and produce start,split1 -- split1+1,split2 -- split2+1,split3 -- split3+1,end

realDates.Zip(realDates.Skip(1), (a, b) => Tuple.Create(a.AddDays(1), b));

关于c# - 将一段时间拆分成多个时间段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10148986/

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