【发布时间】:2011-10-03 12:20:34
【问题描述】:
- 我有一系列具有 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 G4Dn 是我在列表中的不同日期,而 Gm 日期是我想要的日期喜欢在它们中间生成。
问题
如何将单个日期的有序列表转换为对,以便获得如下例所示的对?我想使用 LINQ 而不是 for 循环来形成这些,它可以完成同样的事情。由于延迟表达式树的执行,使用 LINQ 可能会产生更高效的代码。
使用真实示例的附加说明
假设这是我的此类范围示例:
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 最好省略。但是,如果省略它会导致代码过于复杂,则可以保留并排除它,然后再进行单独的检查。但是,如果最初可以排除它,那么这就是应该做的。因此,如果您还提供了有关如何形成排除空范围的对的信息,欢迎您也添加该信息。
【问题讨论】:
-
啊啊啊我无法理解!不连续的日期会发生什么? 1-Jan 5-Jan 和 8-Jan 25-Jan...我认为您应该尝试解释您要解决的问题...事实上,它非常复杂,因为您有重叠的范围并且范围可能是另一个范围的子集。
-
Nitpick:我会使用
....OrderBy(d => d).ToList()而不是....ToList(); dates.Sort(); -
@Robert(有更正)您将如何处理不连贯的日期集?您的示例具有完全重叠的日期集。在 D1 和 D10 之间,没有一天不被“覆盖”。例如,尝试在 D10 的右侧添加一个 D11-D12,其中 D11 > D10。
-
@xanatos:非常好的观点。我改变了我的帖子。
-
@KirkBroadhurst 我显然没有把我的情况说得太好,因为那不是我想要的。我想从连续的项目中形成对......计算中间太简单了,你不觉得吗?