C# 删除LINQ中的重叠日期
我有一个真正的犹太人区实现这个,但我想有一些干净的方式来做这与Linq。我有一个带有开始和停止日期的对象列表C# 删除LINQ中的重叠日期,c#,linq,C#,Linq,我有一个真正的犹太人区实现这个,但我想有一些干净的方式来做这与Linq。我有一个带有开始和停止日期的对象列表 class Thing { int ID; ... DateTime? StartDate; DateTime EndDate; } 在某些情况下,没有开始日期,它为空。我想要算法做的是从列表中删除项目,直到没有日期重叠;我只是用几年来说明这个概念: List<Thing> x = new List<Thing>() { {1, 2012,
class Thing
{
int ID;
...
DateTime? StartDate;
DateTime EndDate;
}
在某些情况下,没有开始日期,它为空。我想要算法做的是从列表中删除项目,直到没有日期重叠;我只是用几年来说明这个概念:
List<Thing> x = new List<Thing>()
{
{1, 2012, 2014}
{2, 2013, 2015}
{3, 2014, 2016}
{4, <null>, 2015}
{5, 2016, 2017}
}
通过algo运行此列表应产生:
var y = Do(x);
y =
{
{1, 2012, 2014}
{2, <null>, 2015}
{3, 2016, 2017}
}
存在循环的可能性,其中存在不同的最佳解决方案。我的数据没有这些边缘情况。如果您的类实现了IEquatable,并且您正确地填写了Equals和GetHashCode方法,那么您就可以这样做了
var结果=x.Distinct 我认为这应该适合你:
List<Thing> x = new List<Thing>()
{
new Thing () { ID = 1, StartDate = new DateTime(2012, 1, 1), EndDate = new DateTime(2014, 1, 1) },
new Thing () { ID = 2, StartDate = new DateTime(2013, 1, 1), EndDate = new DateTime(2015, 1, 1) },
new Thing () { ID = 3, StartDate = new DateTime(2014, 1, 1), EndDate = new DateTime(2016, 1, 1) },
new Thing () { ID = 4, StartDate = null, EndDate = new DateTime(2015, 1, 1) },
new Thing () { ID = 5, StartDate = new DateTime(2016, 1, 1), EndDate = new DateTime(2017, 1, 1) },
};
Func<Thing, Thing, bool> overlaps =
(t0, t1) =>
(t0.StartDate.HasValue ? t0.StartDate.Value <= t1.EndDate : false)
&& (t1.StartDate.HasValue ? t0.EndDate >= t1.StartDate : false);
var y = x.Skip(1).Aggregate(x.Take(1).ToList(), (a, b) =>
{
if (a.All(c => !overlaps(b, c)))
{
a.Add(b);
}
return a;
});
这给了我:
如果你花时间发布有效的C代码,那就太棒了。回答你的问题让我们的生活轻松多了。谢谢。在当地的选举中,跳票是一个很好的伎俩。下层选民愿意发表评论吗?我的答案产生了所要求的输出,我认为代码是相对直接的。