C# 使用LINQ查找列表中的周期关系
我有一个类,其中包含有关期间、开始和结束的日期信息:C# 使用LINQ查找列表中的周期关系,c#,asp.net,linq,C#,Asp.net,Linq,我有一个类,其中包含有关期间、开始和结束的日期信息: public class A { public int Id { get; set; } public string Name { get; set; } public DateTime Start { get; set; } public DateTime End { get; set; } } 然后我有一个对象列表a,其中我声明了几个句点: List<A> listOfA = new List
public class A
{
public int Id { get; set; }
public string Name { get; set; }
public DateTime Start { get; set; }
public DateTime End { get; set; }
}
然后我有一个对象列表a,其中我声明了几个句点:
List<A> listOfA = new List<A>()
{
new A {Id=1,Name="1", Start = new DateTime (2020,1,1), End = new DateTime(2020,1,20) },
new A {Id=2,Name="2", Start = new DateTime (2020,1,21), End = new DateTime(2020,2,20) },
new A {Id=3,Name="3", Start = new DateTime (2020,5,11), End = new DateTime(2020,5,14) },
new A {Id=4,Name="4", Start = new DateTime (2020,5,15), End = new DateTime(2020,5,20) }
};
在上面的例子中,错误的对象在列表中的一个对象内有开始日期,而ok对象并没有关系。如何使用LINQ找到这种关系 它是二次时间复杂度,完全未经测试,但它看起来不错,这才是最重要的
var results = list.Where(x =>
list.Any(y =>
x != y &&
(x.Start >= y.Start && x.Start <= y.End ||
x.End <= y.End && x.End >= y.Start)))
.ToList();
你可以试试:
var wrong2 = listOfA.Any(i => wrong.End > i.Start && wrong.Start < i.End);
var ok2 = listOfA.Any(i => ok.End > i.Start && ok.Start < i.End);
var-errow2=listOfA.Any(i=>error.End>i.Start&&error.Startok.End>i.Start&&ok.Start
“错误2”将为真(重叠)。
“ok2”将为假(无重叠)
<>编辑:您可能应该考虑创建一个“Stand”对象,该对象具有“开始日期”和“EnDeDATE”和“重叠”的方法。结果将是相同的,但更具可读性:-)(请参阅:)。使用
Any
或Aggregate
?如何使用?通过在列表末尾添加错误的结果并检查结果是否为空(这意味着存在关系)?
public class A
{
public int Id { get; set; }
public string Name { get; set; }
public DateTime Start { get; set; }
public DateTime End { get; set; }
public bool Intersect(A a)
=> this != a && (Start >= a.Start && a.Start <= a.End || End <= a.End && End >= a.Start);
}
var wrong = list.Where(x => list.Any(x.Intersect)).ToList();
var good = list.Except(wrong).ToList();
var wrong2 = listOfA.Any(i => wrong.End > i.Start && wrong.Start < i.End);
var ok2 = listOfA.Any(i => ok.End > i.Start && ok.Start < i.End);