2016-05-23 2 views
0

У меня есть два разных списка одного типа. Я хотел сравнить оба списка и получить значения, которые не совпадают. Список класса:Сравнение двух списков с несколькими условиями

public class pre 
{ 
public int id {get; set;} 
public datetime date {get; set;} 
public int sID {get; set;} 
} 

Два списка:

List<pre> pre1 = new List<pre>(); 
List<pre> pre2 = new List<pre>(); 

запрос, который я написал, чтобы получить несовпадающие значения:

var preResult = pre1.where(p1 => !pre 
        .any(p2 => p2.id == p1.id && p2.date == p1.date && p2.sID == p1sID)); 

Но результат здесь не так. Я получаю все значения в pre1.

ответ

4

Вот решение:

class Program 
{ 
    static void Main(string[] args) 
    { 

     var pre1 = new List<pre>() 
     { 
       new pre {id = 1, date =DateTime.Now.Date, sID=1 }, 
       new pre {id = 7, date = DateTime.Now.Date, sID = 2 }, 
       new pre {id = 9, date = DateTime.Now.Date, sID = 3 }, 
       new pre {id = 13, date = DateTime.Now.Date, sID = 4 },   
       // ... etc ... 
     }; 
     var pre2 = new List<pre>() 
     { 
       new pre {id = 1, date =DateTime.Now.Date, sID=1 }, 
       // ... etc ... 
     }; 

     var preResult = pre1.Where(p1 => !pre2.Any(p2 => p2.id == p1.id && p2.date == p1.date && p2.sID == p1.sID)).ToList(); 
     Console.ReadKey(); 
    } 
} 

Примечание: дата собственности содержит дату и время, часть будет 00:00:00.

0

Я исправил некоторые опечатки и проверил ваш код с разумными значениями, и ваш код правильно выбрал бы непревзойденные записи. Как упоминает prabhakaran S's answer, возможно, ваши значения даты включают компоненты времени, которые отличаются. Вам нужно будет проверить свои данные и решить, как действовать.

Однако лучший способ выбрать непревзойденные записи из одного списка по сравнению с другим будет заключаться в использовании техники левого соединения, общей для работы с реляционными базами данных, которую вы также можете использовать в Linq для коллекций в памяти. Он будет лучше масштабироваться по мере увеличения размеров ваших входов.

var preResult = from p1 in pre1 
       join p2 in pre2 
       on new { p1.id, p1.date, p1.sID } 
       equals new { p2.id, p2.date, p2.sID } into grp 
       from item in grp.DefaultIfEmpty() 
       where item == null 
       select p1; 
Смежные вопросы