C# 删除LINQ中的重叠日期

C# 删除LINQ中的重叠日期,c#,linq,C#,Linq,我有一个真正的犹太人区实现这个,但我想有一些干净的方式来做这与Linq。我有一个带有开始和停止日期的对象列表 class Thing { int ID; ... DateTime? StartDate; DateTime EndDate; } 在某些情况下,没有开始日期,它为空。我想要算法做的是从列表中删除项目,直到没有日期重叠;我只是用几年来说明这个概念: List<Thing> x = new List<Thing>() { {1, 2012,

我有一个真正的犹太人区实现这个,但我想有一些干净的方式来做这与Linq。我有一个带有开始和停止日期的对象列表

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代码,那就太棒了。回答你的问题让我们的生活轻松多了。谢谢。在当地的选举中,跳票是一个很好的伎俩。下层选民愿意发表评论吗?我的答案产生了所要求的输出,我认为代码是相对直接的。