LINQ Пересечение на основе собственности - PullRequest
0 голосов
/ 10 июня 2018

Я пытаюсь найти пересечение в двух коллекциях, где элементы перекрываются с обратным состоянием.

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, но ищу более элегантный способ сделать это, у которого есть больше возможностей.

Спасибо

Ответы [ 2 ]

0 голосов
/ 10 июня 2018

как вы упомянули, вы пытаетесь понять 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();

Он будет искать каждую записьв List2 (так же, как foreach(Sample sample in ListOfSamles2)), если в List1 он найдет какую-либо запись (такую ​​же, как вложенный цикл foreach), которая удовлетворяет всем условиям, он выберет эту запись (sample) of List2` и сохранит ее всписок результатов.

То же самое можно сделать, как показано ниже.

List<Sample> intersectSampleLamadaOnly = ListOfSamples2.Where(sample =>
       ListOfSamples1.Any(s => 
             s.StartTime < sample.StartTime && 
             s.EndTime > sample.EndTime && 
             s.SampleState != sample.SampleState)).ToList();
0 голосов
/ 10 июня 2018

Если я правильно понимаю вопрос, вы пытаетесь сделать то, что составляет

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