Pergunta

Eu tenho um dicionário que estou comparando a outro dicionário (variáveis ??digitado como IDictionary). d1.Equals fazendo (d2) produz falsas. Escrever meu próprio código abaixo produz verdadeiro. Ambos são System.Collections.Generic.Dictionary. Estou faltando alguma coisa ou não Dictionary não tem uma implementação Equals que compara chaves / valores?

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;
}
Foi útil?

Solução

Dictionary.Equals () usa o padrão é igual a do objeto, verificando se os dois objetos são a mesma referência, assim como todas as outras coleções padrão. Você é livre para criar sua própria subclasse com valores semânticos, no entanto, que geralmente inclui coisas que são imutáveis ??também.

Outras dicas

Provavelmente o método Equals da classe Dictionary simplesmente recorre à implementação padrão herdado de Object, isto é, ele apenas compara a referência Dictionary objeto passado com a sua própria referência. Veja aqui: Object.Equals referência

Assumindo que dois dicionários, sendo um SortedList<TKey, TValue> e um um Dictionary<TKey, TValue>, são comparados pela igualdade, deve realmente retornar true se os itens são os mesmos? Isso seria muito ruim, uma vez que têm características e funcionalidades diferentes (o SortedList<,> por exemplo, permite a recuperação através do índice).

Além disso, a igualdade e código hash são logicamente amarrados. O código hash deve ser imutável, caso contrário, todos os algoritmos de hash com base não vai funcionar. Você não pode garantir isso quando você está usando o conteúdo para verificar se há igualdade. Portanto, a implementação padrão (verificando se eles são a mesma instância) é bastante saudável. Você é livre para criar sua própria comparação de igualdade conteúdo embora.

Outros, que ele está usando a implementação Object.Equals, você pode usar o seguinte para substituí-lo:

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

As referências no .NET pode ser usado para encapsular a identidade de um objeto, aspectos mutáveis ??de seu estado, ambos, ou nenhum, além de encapsular aspectos imutáveis ??de estado de um objeto. Em geral, na ausência de um motivo especial para assumir outra forma, NET assume que as referências a objectos mutáveis ??são utilizados para o propósito de encapsular identidade. Assume-se ainda que em casos onde o código está comparando referências sem saber o que eles representam, é melhor errar do lado de relatar coisas desiguais. Como tal, duas referências para objetos mutáveis ??são geralmente considerados equivalentes se e somente se eles identificam o mesmo objeto, e os tipos mutáveis ??são assim desencorajados a substituir Equals para indicar que qualquer outra coisa. Em vez disso, o código que utiliza referências para encapsular o estado mutável deve usar alguns outros do que Object.Equals() meios para compará-los.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top