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