を使用して、2つのリスト
List<Medecine> list1;
List<Medecine> list2;
MedecineID
、MedecineName
Medecine
の性質であるが、 `MedecineIDはユニークです。
list1
にありますが、list2
にはないリストオブジェクトが必要です。
を使用して、2つのリスト
List<Medecine> list1;
List<Medecine> list2;
MedecineID
、MedecineName
Medecine
の性質であるが、 `MedecineIDはユニークです。
list1
にありますが、list2
にはないリストオブジェクトが必要です。
var query = list1.Except(list2);
var list1NotList2 = query.ToList();
これは、あなたlist1
なくlist2
内にあるすべてのアイテムを提供します。
Medecine
オブジェクトの平等性を正しく比較できるようにする必要があります(通常Equals
/GetHashCode
)。最後の引数としてIEqualityComparer
というカスタムをExcept
に渡すこともできます。
Except
の詳細については、hereを参照してください。
医薬品クラスのカスタム比較オブジェクトを作成しないようにするには、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));
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
を持っていることによってこれを行うことができます