LINQ删除2个列表中常见的datetime重叠

时间:2017-04-30 19:26:01

标签: c# linq datetime

我有2个对象列表,这些对象都有StartEnd日期时间。

public class TimePeriod {
    public DateTime Start { get; set; }
    public DateTime End { get; set; }
}

现在我想将列表A添加到列表B.但是有时候开始和结束数据可以重叠(不包括在内,所以如果一个对象的StartEnd相同另一个这不会被视为重叠。)如果它们是重叠的,我希望不需要列表中的对象。

我可以使用一些foreach循环来做到这一点,但我觉得使用linq有更简单/更简单的解决方案。

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

如果你想使用LINQ,我会说使用自定义相等比较器的Union()方法是可行的:

public class TimePeriodEqualityComparer : IEqualityComparer<TimePeriod>
{
  public bool Equals(TimePeriod a, TimePeriod b)
  {
    if (object.ReferenceEquals(a, b)) {
        return true;
    }
    if (a.Start < b.Start && a.End > b.End) {
        return true;
    }
    if ((a.Start < b.Start && a.End > b.Start) || (a.Start < b.End && a.End > b.End)) {
        return true;
    }

    return false;
  }

  public int GetHashCode(TimePeriod o)
  {
    // we have to force using the Equals method as it is only used to
    // break the tie when two objects have the same HashCode
    return 0;
  }
}

用法:

var xs = new[] {
    new TimePeriod() { Start = new DateTime(2017, 1, 1), End = new DateTime(2018, 1, 1) },
    new TimePeriod() { Start = new DateTime(2018, 1, 1), End = new DateTime(2019, 1, 1) }
    new TimePeriod() { Start = new DateTime(2017, 10, 1), End = new DateTime(2018, 10, 1) }
};
var ys = new[] {
    new TimePeriod() { Start = new DateTime(2017, 10, 1), End = new DateTime(2017, 11, 1) },
    new TimePeriod() { Start = new DateTime(2018, 1, 1), End = new DateTime(2019, 1, 1) }
};  
var us = xs.Union(ys, new TimePeriodEqualityComparer());

foreach (var u in us) {
    Console.WriteLine(u);
}