我有2个对象列表,这些对象都有Start
和End
日期时间。
public class TimePeriod {
public DateTime Start { get; set; }
public DateTime End { get; set; }
}
现在我想将列表A添加到列表B.但是有时候开始和结束数据可以重叠(不包括在内,所以如果一个对象的Start
与End
相同另一个这不会被视为重叠。)如果它们是重叠的,我希望不需要列表中的对象。
我可以使用一些foreach循环来做到这一点,但我觉得使用linq有更简单/更简单的解决方案。
感谢任何帮助。
答案 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);
}