0

いくつかのテスト ケースを作成していて、MyObject が別の MyObject と等しいかどうかを確認する必要があることに気付きました。

次のように Equals メソッドを作成しました。

public override bool Equals(object obj)
{
    if (ReferenceEquals(null, obj)) return false;
    if (ReferenceEquals(this, obj)) return true;
    return obj.GetType() == typeof(MyObject) && Equals((MyObject) obj);
}

public bool Equals(MyObject other)
{
    if (ReferenceEquals(null, other)) return false;
    if (ReferenceEquals(this, other)) return true;
    return Equals(other.listItems, listItems);
}

public override int GetHashCode()
{
    return (TimeBlocks != null ? TimeBlocks.GetHashCode() : 0);
}

true と評価されない listItems というリストがあります。listItem は、Equals メソッドをオーバーライドする別のオブジェクト タイプです。

リストは、あるリストが別のリストと等しいかどうかをどのように判断しますか?

代わりに、各アイテムを他のアイテムと照合する必要がありますか?

4

3 に答える 3

3

Enumerable.SequenceEqual()その方法を試しましたか?

これにより、両方のの各項目が繰り返され、List各要素が等しいかどうかがチェックされます。オブジェクトのオーバーライドされEquals()たメソッドを使用します。

于 2012-09-27T22:46:17.960 に答える
1

これはあなたが探しているものですか:Enumerable.SequenceEqual

other.listItems.SequenceEqual(listItems);を返します。

于 2012-09-27T22:44:59.643 に答える
1

まず、MyObject を受け取る Equals のオーバーロードはlistItems静的として扱われます。その場合はそうですが、私の推測では、それはタイプミスであり、代わりにそうするMyObject.listItems必要がありother.listItemsます.

ともかく。listItems が の場合List<OtherObject>、List クラス自体は Equals をオーバーライドしないため、ハッシュ コードを比較する Object オーバーロードのみを使用し、Object の場合、それらのハッシュ コードはオブジェクト参照に基づいています。したがって、2 つのリスト変数は、同じリストを参照する場合にのみ等しくなります。

希望どおりに機能させるには、リストをループしてアイテムを比較する必要があります。正確にどのように行うかは、順序が重要かどうかによって異なります。

//order-specific equality; true only if equal items are in the same order
public bool Equals(MyObject other)
{
    if (ReferenceEquals(null, other)) return false;
    if (ReferenceEquals(this, other)) return true;
    return other.listItems.Count == listItems.Count 
       && listItems.Select((l,i)=>other.listItems[i] == l).All(b=>b);
}

//order-independent equality; true if all items in one are in the other in any order
public bool Equals(MyObject other)
{
    if (ReferenceEquals(null, other)) return false;
    if (ReferenceEquals(this, other)) return true;
    return other.listItems.Count == listItems.Count 
       && listItems.Select((l,i)=>other.listItems.Contains(l)).All(b=>b);
}

最初の方法は、2 つの等しいリストが与えられた場合、線形になります。2番目はN ^ 2の複雑さになり、おそらくそれを改善できますが、複雑になります。

于 2012-09-27T23:02:44.773 に答える