12

こんにちは、次のような状況の場合、 sequenceEqualに問題があります。

Sentence s1 = new Sentence { Text = "Hi", Order = 1 };
Sentence s2 = new Sentence { Text = "Hello", Order = 2 };
List<Sentence> list1 = new List<Sentence> { s1, s2 };
List<Sentence> list2 = new List<Sentence> { s1, s2 };

そしてこれはうまくいきます

bool equal = list1.SequenceEqual(list2);

そして戻りますtrue

しかし、たとえば次のようなメソッドがあるList<Sentence> 場合:

public List<Sentence> Getall()
    {
        Sentence s1 = new Sentence { Text = "Hi", Order = 1 };
        Sentence s2 = new Sentence { Text = "Hello", Order = 2 };

        return new List<Sentence> { s1, s2 };
    }

次のように使用します。

List<Sentence> list1 = Getall();
List<Sentence> list2 = Getall();

そして、簡単に確認してください

bool equal = list1.SequenceEqual(list2);

'false' を返します。理由を教えてください。そしてそれを機能させる方法は?

4

3 に答える 3

19

あなたの問題は、あるものnew Sentence { Text = "Hi", Order = 1 }が別のものと等しくないということnew Sentence { Text = "Hi", Order = 1 }です。内容は同じですが、2つの別個のオブジェクトがあり、クラスを設計していない限り、文字通り同じオブジェクトでない限り、それらは互いに等しくありません(最初の例のように)。

Sentenceクラスはオーバーライドする必要がありEqualsGetHashCode少なくとも、その時点でSequenceEquals再度作業する必要があります。

于 2013-02-19T13:00:06.360 に答える
12

MSDNがここに述べているように:

タイプのデフォルトの等式比較子を使用して要素を比較することにより、2つのシーケンスが等しいかどうかを判別します。

Sentenceあなたの場合は、デフォルトEqualsとが付いた参照型ですGetHashCode。これは、各要素に参照の同等性を使用することを意味します。

あなたはいつでも受け入れる過負荷を使用することができますIEqualityComparer

于 2013-02-19T13:00:16.733 に答える
2

を呼び出すたびに、Sentence の 2 つの新しいインスタンスを作成していますGetall()。リスト内の要素を比較するときはSequenceEqual、デフォルトの等値比較子を使用します。これは基本的に、それらが同じオブジェクトを参照していることを確認するだけです。それらは異なるため、それらは異なります。

できることは、Sequence のEqual()and==演算子をオーバーライドして、他のプロパティ (Text や Order など) の等価性をチェックさせることです。

または、 を書いてIEqualityComparer<Sequence>に渡すこともできますSequenceEqual

于 2013-02-19T13:04:01.717 に答える