CustomsObjects で満たされた 2 つの汎用リストがあります。
これら 2 つのリストの差 (最初のリストにある項目と 2 番目のリストにある項目を除く) を 3 番目のリストで取得する必要があります。
使用するのは良い考えだと思っていました.Except()
が、これをどのように使用すればよいのかわかりません。助けてください!
ベストアンサー1
を使用するのExcept
がまさに正しい方法です。型が と をオーバーライドする場合Equals
、GetHashCode
または参照型の等価性のみに関心がある場合 (つまり、2 つの参照が「等しい」のは、まったく同じオブジェクトを参照する場合のみ)、次のように使用できます。
var list3 = list1.Except(list2).ToList();
たとえば ID によって、等価性のカスタム アイデアを表現する必要がある場合は、 を実装する必要がありますIEqualityComparer<T>
。例:
public class IdComparer : IEqualityComparer<CustomObject>
{
public int GetHashCode(CustomObject co)
{
if (co == null)
{
return 0;
}
return co.Id.GetHashCode();
}
public bool Equals(CustomObject x1, CustomObject x2)
{
if (object.ReferenceEquals(x1, x2))
{
return true;
}
if (object.ReferenceEquals(x1, null) ||
object.ReferenceEquals(x2, null))
{
return false;
}
return x1.Id == x2.Id;
}
}
次に以下を使用します:
var list3 = list1.Except(list2, new IdComparer()).ToList();
list2
これにより重複する要素が削除されることに注意してください。重複を保持する必要がある場合は、次のようなセットを作成して使用するのが最も簡単でしょう。
var list3 = list1.Where(x => !set2.Contains(x)).ToList();