【发布时间】:2018-11-19 21:01:48
【问题描述】:
我试图在两个集合上找到一个交集,其中项目重叠并具有相反的状态。
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 执行此操作,但我正在寻找一种更优雅的方式来执行此操作,它有更多选择。
谢谢
【问题讨论】:
-
我正在尝试了解 Linq 相交,在阅读后似乎如果我想使用 Intersect 我需要一个比较器。我对 Linq 并不了解,否则我不会在这里。我尝试了一个 IEqualityComparer public class SampleComparer2 : IEqualityComparer
{ public bool Equals(Sample xrSample, Sample islSample) { return xrSample.StateType != islSample.StateType; } public int GetHashCode(Sample sample) { return sample.GetHashCode(); } } -
交集 是集合论中的一个术语。在关系代数中,这同样被称为 join。
-
A set Intersect 与 time period intersect 不同,我认为这在这里令人困惑,因为 LINQ 有一个
Intersect方法。也许如果你说重叠会更清楚?另外,那么您可以澄清重叠是否足够,或者您需要一个时间段的遏制?它可以在任何一个方向发生吗? -
感谢您的澄清和帮助。是的,我会说重叠就足够了。