0

ジェネリックコレクションを検索して、オブジェクトのプロパティが等しいかどうかを確認するにはどうすればよいですか?

List<Customer> = customers = GetCustomers();

Customer c = new Customer() { FirstName = "Sam" };

customers.Contains(c); //doesn't work
4

2 に答える 2

5

オブジェクトの「等式」を定義する必要があります。これはいくつかの方法で行うことができます。

  1. Equalsそれ自体のメソッドをオーバーライドして、Customerあなたが平等と考えるものを使用するようにします。
  2. IEqualityComparerに渡すことができる実装を含むカスタム比較子を定義します。異なる時間に異なる「等式」の定義を使用する必要がある場合、またはタイプを変更する機能がない場合は、これを実行します。

型をオーバーライドするときはいつでも、をオーバーライドEqualsすることが重要GetHashCodeであり、その逆も同様であることに注意してください。の定義によって等しいと見なされるすべてのオブジェクトがEquals同じハッシュコードを持っていることを確認することが重要です。この特定のケースでは問題になりませんが、ハッシュベースのデータ構造を使用する場合は問題になります。

于 2012-12-18T20:54:29.990 に答える
1

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; }
    }
}
于 2012-12-18T21:12:46.660 に答える