2011-07-16 63 views
1

我MEDECINE對象的兩個列表:比較兩個列表<T>使用LINQ

List<Medecine> list1; 
List<Medecine> list2; 

MedecineIDMedecineName等都是Medecine性能; `MedecineID是獨一無二的。

我想要一個列表中的對象在list1但不在list2;

回答

3
var query = list1.Except(list2); 
var list1NotList2 = query.ToList(); 

這會給你一切都在list1但不list2的項目。

請注意,您需要確保您的Medecine對象可以正確比較(通常通過Equals/GetHashCode)。您還可以傳遞一個自定義IEqualityComparer作爲Except的最後一個參數。

有關Except的更多信息,請參閱here

0

如果你想避免編寫自定義的比較對象爲你的藥類,那麼你可以只投影「MedecineId」出第二個列表進入一個新的集合,然後使用IEnumerable.Contains()創建您的「期望」的文章:

class Medecine 
{ 
    public Guid MedecineId { get; set; } 
    public String Name { get; set; } 
    // whatever other fields 
} 

創建一些測試數據:

List<Guid> mIds = 
    new List<Guid>(Enumerable.Range(0, 20).Select(n => Guid.NewGuid())); 

List<Medecine> m1 = new List<Medecine> 
(
    Enumerable.Range(0, 10).Select(c => new Medecine() { MedecineId = mIds.ElementAt(c), Name = c.ToString() }) 
); 

List<Medecine> m2 = new List<Medecine> 
(
    Enumerable.Range(5, 15).Select(d => new Medecine() { MedecineId = mIds.ElementAt(d), Name = d.ToString() }) 
); 

然後讓你的結果很簡單:

var excludedIds = m2.Select(m2s => m2s.MedecineId).Distinct(); 
var results = m1.Where(m1s => !excludedIds.Contains(m1s.MedecineId)); 
2

自然的方式在LINQ做,這是通過使用Enumerable.Except方法:

var results = list1.Except(list2).ToList(); 

然而,對於這個工作,你必須告訴LINQ當兩個對象是「相同的」。

class Medecine : IEquatable<Medecine> 
{ 
    public int MedecineID { get; set; } 
    public string MedecineName { get; set; } 

    public override int GetHashCode() { 
     return this.MedecineID; 
    } 

    public bool Equals(Medecine other) 
    { 
     if (ReferenceEquals(null, other)) { 
      return false; 
     } 
     if (ReferenceEquals(this, other)) { 
      return true; 
     } 
     return other.MedecineID == this.MedecineID; 
    } 

    public override bool Equals(object obj) 
    { 
     if (ReferenceEquals(null, obj)) { 
      return false; 
     } 
     if (ReferenceEquals(this, obj)) { 
      return true; 
     } 
     if (obj.GetType() != typeof(Medecine)) { 
      return false; 
     } 
     return Equals((Medecine)obj); 
    } 
} 

如果這種方式不適合,你可以使一個IEqualityComparer<Medecine>並傳遞到Except作爲附加參數:

class MyComparer : IEqualityComparer<Medecine> 
{ 
    public bool Equals(Medecine x, Medecine y) 
    { 
     if (x == null && y == null) { 
      return true; 
     } 

     if (x == null || y == null) { 
      return false; 
     } 

     return x.MedecineID == y.MedecineID; 
    } 

    public int GetHashCode(Medecine obj) 
    { 
     return obj.MedecineID; 
    } 
} 

var results = list1.Except(list2, new MyComparer()).ToList(); 
可以通過讓 Medecine實現 IEquatable<Medecine>這樣做