我有一个初始和最终日期范围 = 1/1/2015 - 1/30/2015
我有这些代表不可用日期的日期范围。
1/5/2015 - 1/10/2015
1/15/2015 - 1/20/2015
1/22/2015 - 1/28/2015
我想要这个输出,主要是主要范围的可用日期:
A: 1/1/2015 - 1/4/2015
B: 1/11/2015 - 1/14/2015
C: 1/21/2015 - 1/21/2015
D: 1/29/2015 - 1/30/2015
我尝试生成这样的连续日期范围,以便使用 except() 获取异常日期,但我认为我使事情变得复杂。
//dtStartDate = 1/1/2015
//dtEndDate = 1/30/2015
var days = (int)(dtEndDate - dtStartDate).TotalDays + 1;
var completeSeq = Enumerable.Range(0, days).Select(x => dtStartDate.AddDays(x)).ToArray();
我怎样才能得到一段时间内日期范围的差距。
换句话说,我怎样才能从这张图片中得到A、B、C和D
http://www.tiikoni.com/tis/view/?id=ebe851c http://www.tiikoni.com/tis/view/?id=ebe851c
如果这些日期重叠,则不能只考虑有间隙的地方。
- - - - - 更新 - - - - - -
我想如果我这样做:
var range = Enumerable.Range(0, (int)(1/10/2015 - 1/5/2015).TotalDays + 1).Select(i => 1/5/2015.AddDays(i));
var missing = completeSeq.Except(range).ToArray();
对于每个日期范围,我将排除给定的每个日期范围,但仍然无法获得间隙!
我今天早上看到你的问题,非常喜欢它,但一整天都很忙。所以,有机会回答你的问题,相信我,我很喜欢它。这是我的代码:-
DateTime startDate = new DateTime(2015, 1, 1);
DateTime endDate = new DateTime(2015, 1, 30);
int totalDays = (int)(endDate - startDate).TotalDays + 1;
availability.Add(new Availability { StartDate = endDate, EndDate = endDate });
var result = from x in Enumerable.Range(0, totalDays)
let d = startDate.AddDays(x)
from a in availability.Select((v, i) => new { Value = v, Index = i })
where (a.Index == availability.Count - 1 ?
d <= a.Value.StartDate : d < a.Value.StartDate)
&& (a.Index != 0 ? d > availability[a.Index - 1].EndDate : true)
group new { d, a } by a.Value.StartDate into g
select new
{
AvailableDates = String.Format("{0} - {1}",g.Min(x => x.d),
g.Max(x => x.d))
};
这肯定需要解释,所以这里是:-
Step 1:使用以下命令创建从 Jan 01 到 Jan 30 的日期范围Enumerable.Range
Step 2:由于在第二个不可用的日期范围之后,我们需要限制从最后一个结束日期到当前对象开始日期选择的日期,我已经计算过index
这样我们就可以访问最后一个结束日期。
Step 3:一旦我们获得索引,我们需要做的就是过滤除第一个日期范围之外的日期,因为在这种情况下我们没有最后一个对象。
Step 4:对于最后一项,因为我们没有最大范围,所以我将 endDate 添加到我们的不可用列表中(希望这是有意义的)。
这里是工作小提琴 https://dotnetfiddle.net/B8GA60,如果你感到困惑,只需删除group by
和其他过滤器并调试并查看结果输出,它看起来相当简单:)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)