문제

나는 다른 사전과 비교하는 사전이 있습니다 (유명한 변수). d1.equals (d2)를 수행하면 거짓이됩니다. 내 자신의 코드를 작성하면 사실이됩니다. 둘 다 System.Collections.Generic.Dictionary. 내가 뭔가를 놓치거나하는 건가요? Dictionary 없습니다 Equals 키/값을 비교하는 구현?

private static bool DictEquals<K, V>(IDictionary<K, V> d1, IDictionary<K, V> d2)
{
    if (d1.Count != d2.Count)
        return false;

    foreach (KeyValuePair<K, V> pair in d1)
    {
        if (!d2.ContainsKey(pair.Key))
            return false;

        if (!Equals(d2[pair.Key], pair.Value))
            return false;
    }

    return true;
}
도움이 되었습니까?

해결책

Dictionary.equals ()는 객체의 기본값을 사용하여 두 객체가 다른 모든 기본 컬렉션과 마찬가지로 두 객체가 동일한 참조인지 확인합니다. 가치 의미론으로 자신만의 하위 클래스를 만들 수 있지만 일반적으로 불변의 것들도 포함됩니다.

다른 팁

아마 Equals 방법의 방법 Dictionary 클래스는 단순히 상속 된 기본 구현에 의존합니다 Object, 즉, 그것은 단지 비교합니다 Dictionary 객체 참조는 자체 참조로 전달되었습니다. 여기를 봐: Object.equals 참조

두 사전을 가정하면, 하나는 a SortedList<TKey, TValue> 그리고 하나 a Dictionary<TKey, TValue>, 평등과 비교되며, 항목이 동일하다면 실제로 사실이 반환되어야합니까? 특성과 특징이 다르기 때문에 꽤 나쁠 것입니다 ( SortedList<,> 예를 들어 인덱스를 통해 검색 할 수 있습니다).

또한 평등과 해시 코드는 논리적으로 묶여 있습니다. 해시 코드는 불변이어야합니다. 그렇지 않으면 모든 해시 기반 알고리즘이 작동하지 않습니다. 내용을 사용하여 평등을 확인할 때이를 보장 할 수 없습니다. 따라서 기본 구현 (동일한 인스턴스인지 확인)은 제정신입니다. 그래도 자신만의 콘텐츠 평등 비교를 자유롭게 만들 수 있습니다.

다른 사람들은 객체를 사용하고 있다고 언급했습니다.

public class EqualsDictionary<T, T> : Dictionary<T, T>
{
    public override bool Equals(object obj)
    {
        //Place your comparison implementation here
    }
}

.NET의 참고 문헌은 객체의 상태의 불변 측면을 캡슐화하는 것 외에도 객체의 정체성, 상태의 돌연변이 가능한 측면을 캡슐화하는 데 사용될 수 있습니다. 일반적으로, 그렇지 않다고 가정 해야하는 특정한 이유가 없으면 .NET은 돌연변이 가능한 물체에 대한 참조가 신원을 캡슐화하기 위해 사용된다고 가정합니다. 또한 코드가 자신이 나타내는 것을 모르고 참조를 비교하는 경우, 불평등 한 것을보고하는 측면에서 오류가 더 낫다고 가정합니다. 따라서, 돌연변이 가능한 물체에 대한 두 가지 참조는 일반적으로 동일한 객체를 식별하는 경우에만 동등한 것으로 간주되며, 이는 돌연변이 유형이 재정의를 방해하지 않습니다. Equals 다른 것을 나타냅니다. 대신, 참조를 사용하여 캡슐화가 변호성 상태를 사용하는 코드는 다른 수단을 사용해야합니다. Object.Equals() 그들을 비교합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top