ジェネリックコレクションを検索して、オブジェクトのプロパティが等しいかどうかを確認するにはどうすればよいですか?
List<Customer> = customers = GetCustomers();
Customer c = new Customer() { FirstName = "Sam" };
customers.Contains(c); //doesn't work
ジェネリックコレクションを検索して、オブジェクトのプロパティが等しいかどうかを確認するにはどうすればよいですか?
List<Customer> = customers = GetCustomers();
Customer c = new Customer() { FirstName = "Sam" };
customers.Contains(c); //doesn't work
オブジェクトの「等式」を定義する必要があります。これはいくつかの方法で行うことができます。
Equals
それ自体のメソッドをオーバーライドして、Customer
あなたが平等と考えるものを使用するようにします。IEqualityComparer
に渡すことができる実装を含むカスタム比較子を定義します。異なる時間に異なる「等式」の定義を使用する必要がある場合、またはタイプを変更する機能がない場合は、これを実行します。型をオーバーライドするときはいつでも、をオーバーライドEquals
することが重要GetHashCode
であり、その逆も同様であることに注意してください。の定義によって等しいと見なされるすべてのオブジェクトがEquals
同じハッシュコードを持っていることを確認することが重要です。この特定のケースでは問題になりませんが、ハッシュベースのデータ構造を使用する場合は問題になります。
Equalsのオーバーライド、IEqualityComparerの実装、およびGetHashCodeのオーバーライドは少し手間がかかります。
Resharperを使用している場合は、これらのメソッドを生成できます。
Equalsをオーバーライドし、IEqualityComparerを実装し、GetHashCodeをオーバーライドするのは、アプリケーション全体で顧客を比較することを計画している場合のみです。並べ替えなど、他の理由がある可能性があります。
単一の場所でのみ比較する場合、LINQ拡張機能は、アイテムを検索および取得するための堅牢なsetメソッドを提供します。Equalsメソッドをオーバーライドする問題に進む前に、そこを調べます。
[TestFixture]
public class ContainsTest
{
[Test]
public void TestFind()
{
var customers = new List<Customer>
{
new Customer() {FirstName = "Chuck"},
new Customer() {FirstName = Path.GetRandomFileName()},
new Customer() {FirstName = Path.GetRandomFileName()},
new Customer() {FirstName = Path.GetRandomFileName()},
new Customer() {FirstName = Path.GetRandomFileName()},
};
//Get all objects that match
var findResult = customers.Find(c => c.FirstName =="Chuck");
var findSingle = customers.Single(c => c.FirstName == "Chuck");
//Has at least one instance
customers.Any(c => c.FirstName.Contains("Chuck"));
}
public class Customer
{
public string FirstName { get; set; }
}
}