2016-05-23 105 views
0

我有兩個相同類型的不同列表。我想比較兩個列表,並需要獲取不匹配的值。 類List:將兩個列表與多個條件進行比較

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;