C# 基于属性的LINQ相交

C# 基于属性的LINQ相交,c#,linq,join,intersect,C#,Linq,Join,Intersect,我试图在两个集合上找到一个交集,其中项目重叠,状态相反 public class Sample { public int SampleNumber { get; set; } public DateTime StartTime { get; set; } public DateTime EndTime { get; set; } public bool SampleState { get; set; } } 例如: List<Sample> List

我试图在两个集合上找到一个交集,其中项目重叠,状态相反

public class Sample
{
    public int SampleNumber { get; set; }
    public DateTime StartTime { get; set; }
    public DateTime EndTime { get; set; }
    public bool SampleState { get; set; }
}
例如:

List<Sample> ListOfSamples1 = new List<Sample>();
List<Sample> ListOfSamples2 = new List<Sample>();

ListOfSamples1.Add( new Sample() {SampleNumber=1, StartTime = new DateTime(2018, 12, 1, 0, 0, 0), EndTime = new DateTime(2018, 12, 1, 0, 10, 0), SampleState= true });
ListOfSamples1.Add( new Sample() {SampleNumber=2, StartTime = new DateTime(2018, 12, 1, 0, 20, 0), EndTime = new DateTime(2018, 12, 1, 0, 30, 0), SampleState= false });

ListOfSamples2.Add( new Sample() {SampleNumber=3, StartTime = new DateTime(2018, 12, 1, 0, 5, 0), EndTime = new DateTime(2018, 12, 1, 0, 7, 0), SampleState= false});
ListOfSamples2.Add( new Sample() {SampleNumber=4, StartTime = new DateTime(2018, 12, 1, 0, 21, 0), EndTime = new DateTime(2018, 12, 1, 0, 22, 0), SampleState= true});
我想返回ListOfSamples2中的样本,这些样本与ListOfSamples1中存在的样本相交,其中SampleState是相反的

例如,ListOfSamples2[0]的StartTime和EndTime确实位于ListOfSamples1[0]中,并且它们的状态相反

我正在用ForEach做这件事,但我正在寻找一种更优雅的方式来做这件事,有更多的选择


谢谢你

如果我正确理解了这个问题,那么你正在尝试做相当于

public static IEnumerable<Sample> MakeSamples(
    IEnumerable<Sample> listOfSamples1,
    IEnumerable<Sample> listOfSamples2) =>
    listOfSamples2.Where(s2 =>
        listOfSamples1.Any(s1 =>
            s1.SampleState != s2.SampleState &&
            s2.EndTime >= s1.StartTime &&
            s2.StartTime <= s1.EndTime));

正如你提到的,你正在努力理解linq

在这里,我创建了一个linq查询来执行您想要的操作

    List<Sample> intersectSample =
    (from sample in ListOfSamples2
        where
            ListOfSamples1.Any(s => s.StartTime < sample.StartTime &&
                                    s.EndTime > sample.EndTime &&
                                    s.SampleState != sample.SampleState)
        select sample).ToList();

我试图理解Linq intersect,在阅读之后,似乎如果我想使用intersect,我需要一个比较器。我对Linq不是那么了解,否则我就不会在这里了。我尝试了一个IEqualityComparer公共类SampleComparer2:IEqualityComparer{public bool EqualsSample xrSample,Sample islSample{return xrSample.StateType!=islSample.StateType;}public int GetHashCodeSample Sample{return sample.GetHashCode;}}有帮助吗?交集是集合论中的一个术语。在关系代数中,它被称为连接。集合交集与时间段交集不同,我认为这在这里很容易混淆,因为LINQ有一个交集方法。也许如果你说重叠会更清楚?另外,你可以澄清重叠是否足够或需要用一个时间段来限制另一个时间段?这会发生在任何一个方向吗?谢谢你的澄清和对措辞的帮助。是的,我想说重叠就足够了。
List<Sample> intersectSampleLamadaOnly = ListOfSamples2.Where(sample =>
       ListOfSamples1.Any(s => 
             s.StartTime < sample.StartTime && 
             s.EndTime > sample.EndTime && 
             s.SampleState != sample.SampleState)).ToList();