C# 如何使用loop或linq比较和分割开始时间和结束时间?
我有一张像这样的清单C# 如何使用loop或linq比较和分割开始时间和结束时间?,c#,linq,C#,Linq,我有一张像这样的清单 [15/05/2019 10:01] [15/05/2019 10:03] [15/05/2019 10:05] [15/05/2019 10:09] [15/05/2019 10:11] [15/05/2019 10:19] [15/05/2019 10:22] [15/05/2019 10:28] [15/05/2019 10:30] [15/05/2019 10:35] [15/05/2019 10:38] [15/05/2019 10:42] [15/05/2019
[15/05/2019 10:01]
[15/05/2019 10:03]
[15/05/2019 10:05]
[15/05/2019 10:09]
[15/05/2019 10:11]
[15/05/2019 10:19]
[15/05/2019 10:22]
[15/05/2019 10:28]
[15/05/2019 10:30]
[15/05/2019 10:35]
[15/05/2019 10:38]
[15/05/2019 10:42]
[15/05/2019 10:45]
[15/05/2019 10:55]
[15/05/2019 11:01]
[15/05/2019 11:11]
[15/05/2019 11:18]
[15/05/2019 11:25]
[15/05/2019 11:29]
[15/05/2019 11:41]
我还有一张单子
[StartTime=15/05/2019 10:08,EndTime=15/05/2019 10:28]
[StartTime=15/05/2019 10:42,EndTime=15/05/2019 10:48]
[StartTime=15/05/2019 11:20,EndTime=15/05/2019 11:26]
结果
[StartTime=15/05/2019 10:01,EndTime=15/05/2019 10:05]
[StartTime=15/05/2019 10:30,EndTime=15/05/2019 10:38]
[StartTime=15/05/2019 10:55,EndTime=15/05/2019 11:18]
[StartTime=15/05/2019 11:29,EndTime=15/05/2019 11:41]
如果可以使用LINQ或for循环获取开始和结束时间
例如:
1) 选择第二个列表中的第一项
[StartTime=15/05/2019 10:08,EndTime=15/05/2019 10:28]
并在第一个列表中检查下面的计时,该计时结果如下所示
[15/05/2019 10:01]
[15/05/2019 10:03]
[15/05/2019 10:05]
[15/05/2019 10:30]
[15/05/2019 10:35]
[15/05/2019 10:38]
现在认为开始时间为[15/05/2019 10:01],结束时间为[15/05/2019 10:05]
2) 现在再次考虑第二个列表,并选择第二项
[StartTime=15/05/2019 10:42,EndTime=15/05/2019 10:48]
并检查下面第二个列表中的计时第一个结束时间到第二个列表第二个开始时间,结果如下
[15/05/2019 10:01]
[15/05/2019 10:03]
[15/05/2019 10:05]
[15/05/2019 10:30]
[15/05/2019 10:35]
[15/05/2019 10:38]
现在认为开始时间为[15/05/2019 10:30],结束时间为[15/05/2019 10:38]
同样,我们将遵循以下步骤
谢谢,问题和描述都很清楚,一切都很简单 1/。对于您范围内的每个日期,您将选择以下日期:
-低于开始日期-高于上一个范围日期。
以最低可能值作为下界开始。
2/. 对结果进行排序。
3/. 如果有多个结果,则将第一个和最后一个作为新的日期范围 代码:
var result = new List<Foo>();
var lastLowerBound = DateTime.MinValue;
foreach (var range in List2)
{
var filteredDates = List1.Where(d => d >= lastLowerBound && d <= range.StartTime)
.OrderBy(x => x);
if (filteredDates.Count()> 1)
{
result.Add(
new Foo {
StartTime = filteredDates.First(),
EndTime = filteredDates.Last()
});
}
else
{
//How to make a date range if there is only one date?
}
lastLowerBound = range.EndTime;
}
注意:可以进行很多优化。
这只是基于OP描述的最简单的算法。
一个关于如何将英语翻译成代码的示例。通常,我会使用一些扩展方法来简化,但这里有一个标准的LINQ解决方案。假设第一个
列表
是src
,第二个列表
是rangeBreaks
,并且rangeBreaks
排序正确
然后,您可以通过压缩rangeBreaks
本身来创建一个新的要查找的间隔列表,跳过第一个间隔,这样您就可以将一个间隔的EndTime
与下一个间隔的StartTime
结合起来:
var gaps = new[] { new { DateTime.MinValue, MaxValue = rangeBreaks[0].StartTime } }
.Concat(rangeBreaks.Zip(rangeBreaks.Skip(1), (f, s) => new { MinValue = f.EndTime, MaxValue = s.StartTime }))
.Concat(new[] { new { MinValue = rangeBreaks.Last().EndTime, DateTime.MaxValue } });
这样,就很容易将src
列表
分成适合每个间隔的组,然后使用每个间隔的第一个和最后一个来创建新的间隔记录
var ans = gaps.Select(g => src.Where(s => g.MinValue < s && s < g.MaxValue).ToList())
.Select(gl => new { StartTime = gl.Min(), EndTime = gl.Max() });
var-ans=gaps.Select(g=>src.Where(s=>g.MinValuenew{StartTime=gl.Min(),EndTime=gl.Max()});
注意:如果订购了
src
,您可以使用First()
和Last()
而不是Min()
和Max()
不清楚前两个列表如何给出第二个。我会推荐阅读。减少输入示例并解释用于计算它的算法。我认为OP正在寻找一种方法,该方法从第一个列表中排除第二个元素范围内的所有datetimelist@xdtTransform看起来他想要的是第一个列表中的范围,而第二个列表中不存在该范围。是否通过删除所有日期获得结果在第二个列表范围内的哪一个?如果是这样的话。或者添加一个not代码>或期待列表:查看帮助页面和Jon Skeet的博客文章。开始时间:2019年5月15日10:01:00结束时间:2019年5月15日10:05:00开始时间:2019年5月15日10:01:00结束时间:2019年5月15日10:42:00开始时间:2019年5月15日10:01:00结束时间:2019年5月15日11:18:00这不是我期望的结果。没有Ide仅使用电话浏览器在在线IDE上键入。简单的调试器将显示我“忘记”设置lastLowerBound=range.EndTime代码>。最后一个范围不在你的algo演练中。在线演示已被删除,因为它是一个痛苦的编辑。但是代码是有效的。谢谢你的回复。我们得到了预期的结果。非常感谢我们收到了预期的结果。