2015-04-07 106 views
1

可以說我有對象的列表:如何比較C#中的兩個對象列表?

public class MyObject 
{ 
    public int ID {get;set;} 
    public string Name {get;set;} 
    public DateTime StartDate {get;set;} 
} 

現在的數據:

{0, "my", DateTime.Now} 
{0, "List", DateTime.Now} 
{0, "Data", DateTime.Now} 

現在說我從一個XML或Excel文檔剝離這個數據,我想什麼是比較數據庫並忽略已存在的數據。我正在使用實體框架來處理這個問題。

public IEnumerable<MyObject> GetBy() 
{ 
    return _context.MyObjects.OrderBy(x => x.Name); 
} 

我知道,如果你想從列表中獲取數據的地方不同的是,你使用:

var myNewStuff = myStuff.Except(myDataBaseStuff); 

但沒有ID屬性的匹配,這樣是行不通的

如何根據Name和StartDate值比較兩個列表?

回答

4

您需要實施自己的IEqualityComparer並使用Except的過載。使用ReSharper的,我產生這樣一條:

public sealed class NameStartDateEqualityComparer : IEqualityComparer<MyObject> 
{ 
    public bool Equals(MyObject x, MyObject y) 
    { 
     if (ReferenceEquals(x, y)) return true; 
     if (ReferenceEquals(x, null)) return false; 
     if (ReferenceEquals(y, null)) return false; 
     if (x.GetType() != y.GetType()) return false; 
     return string.Equals(x.Name, y.Name) && x.StartDate.Equals(y.StartDate); 
    } 

    public int GetHashCode(MyObject obj) 
    { 
     unchecked 
     { 
      return ((obj.Name != null ? obj.Name.GetHashCode() : 0)*397)^obj.StartDate.GetHashCode(); 
     } 
    } 
} 

注意,比較器只檢查NameStartDate性能。您當然可以根據自己的喜好更改比較器,比如在比較之前截斷StartDate的毫秒數。然後使用它:

var myNewStuff = myStuff.Except(myDataBaseStuff, new NameStartDateEqualityComparer()); 
+0

這就是我想我必須要做的事情。我希望有一些我不知道的方法可以處理它。 – Robert