2011-07-16 14 views

答えて

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

これは、あなたlist1なくlist2内にあるすべてのアイテムを提供します。

Medecineオブジェクトの平等性を正しく比較できるようにする必要があります(通常Equals/GetHashCode)。最後の引数としてIEqualityComparerというカスタムをExceptに渡すこともできます。

Exceptの詳細については、hereを参照してください。

0

医薬品クラスのカスタム比較オブジェクトを作成しないようにするには、2番目のリストの "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(); 

、これはあなたが2つのオブジェクトが「同じ」である場合に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(); 
あなたはこのよう IEquatable<Medecine>を実装 Medecineを持っていることによってこれを行うことができます
関連する問題