さて、あなたのシナリオでは、クラスでContains
メソッドを使用する必要があります。List
では、あなたが尋ねるかもしれない存在の目的は何ですか? さて、Contains
メソッドはオブジェクトのメソッドを使用して、Equals
チェックしているアイテムがリストに含まれているかどうかを判断します。Equals
これは、クラスが等価性チェックのメソッドをオーバーライドした場合にのみ機能します。そうでない場合、同等と見なされるものの 2 つの別個のインスタンスは、同等とは見なされません。
Equals
それに加えて、メソッドが提供する別のロジックを使用したい場合があります。現在、何かがリストにあるかどうかを判断する唯一の方法は、それを自分で反復するか、独自の EqualityComparer を記述してインスタンスの等価性をチェックすることです。
したがって、リスト クラスがExists
行うことは、定型的な反復を行いながら、独自のロジックを簡単な方法で提供できるように、いくつかのメソッドを公開することです。
例
タイプのリストがあるとしDog
ます。現在、犬のクラスはEquals
メソッドをオーバーライドしているため、犬が別の犬と等しいかどうかを確認する方法はありませんが、犬の名前や所有者など、犬に関する情報がいくつかあります。したがって、次のことを検討してください
List<Dog> dogs = new List<Dog> {
new Dog { Name = "Fido", Owner = "Julie" },
new Dog { Name = "Bruno", Owner = "Julie" },
new Dog { Name = "Fido", Owner = "George" }
};
Dog fido = new Dog { Name = "Fido", Owner = "Julie" };
List.Contains(fido)
- false を返します (
Equals
メソッドがオーバーライドされていないため)
List.Exists(x => fido.Name == x.Name && fido.Owner == x.Owner)
- 文字列であり、等価性がオーバーライドされているプロパティの等価性をチェックしているため、true を返します。
リスト クラスのソース コードを見ると、おそらく次のようになります。
public bool Exists(Predicate<Dog> predicate) {
foreach (Dog item in Items) {
if (predicate(item))
return true;
}
return false;
}
上記の述語を入力すると、メソッドは次のようになります
public bool Exists(Dog other) {
foreach (Dog item in Items) {
if (item.Name == other.Name && item.Owner == other.Owner)
return true;
}
return false;
}