- 我有一系列带有“from”和“to”日期的对象。
使用以下内容:
IList<DateTime> dates =
this.DateRanges
.SelectMany(r => new [] { r.From, r.To })
.Distinct()
.OrderBy(d => d)
.ToList();
我可以获取所有日期,而且不会有任何重复的日期。范围可能完全重叠、部分重叠(上部或下部重叠)、触及或根本不重叠。
现在我需要将此列表转换为另一个列表,以便每个连续的日期对形成一个新生成的DateTime
实例,该实例位于日期对中间。
D1 D2 D3 D4 D5
G1 G2 G3 G4
如何将一组有序的日期转换为成对的日期,产生的日期对如下所示?我想使用 LINQ 来实现这个目标,而不是使用 for
循环。使用 LINQ 可能会导致更有效的代码,因为它支持延迟表达树执行。
Dn 是来自列表中不同的日期,而 Gm 日期是我想在这些日期之间生成的日期。
以下是一个真实世界例子:
D1 D2 D3 D4 D5 D6 D11 D12
|--------------| |------| |------| |------|
D7 D8
|--------------------------|
D9 D10
|-----------------------------------------------|
获取不同日期的第一步骤将会得到以下日期:
D1 D7 D2 D3 D4 D5 D6 D10 D11 D12
D9和D8会被删除,因为它们是重复的。
下一步是形成一对(我不知道如何使用LINQ完成此操作):
D1-D7, D7-D2, D2-D3, D3-D4, D4-D5, D5-D6, D6-D10, (D10-D11), D11-D12
最后一步是使用以下公式为每对计算一个日期:
Dnew = Dfrom + (Dto - Dfrom)/2
空范围问题
最好省略D10-D11范围,如果省略会导致代码过于复杂,则可以保留该范围并在之后进行单独检查排除。但是,如果在初始时可以排除它,那就应该这样做。因此,如果您提供了如何形成不包括空范围的一对配对的信息,也可以添加该信息。
....ToList(); dates.Sort();
而不是....OrderBy(d => d).ToList()
。 - sehe