Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用LINQ查找列表中的周期关系_C#_Asp.net_Linq - Fatal编程技术网

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);