Obter uma chave igual a um item de SortedDictionary?
-
14-11-2019 - |
Pergunta
Existe alguma maneira de recuperar uma chave a partir de um SortedDictionary que é igual a um determinado objeto?Para ilustrar, digamos que eu crie um dicionário que tenha bastante memória-pesado, imutável tipo de chave:
var dictionary = SortedDictionary<MyHugeType, int>();
var myEnormousKey = new MyHugeType();
dictionary[myEnormousKey] = 123;
Em seguida, mais tarde, faço algo parecido com isto:
// This is a new instance, but it's identical to the previous key
var myIdenticalKey = new MyHugeType();
if(dictionary.ContainsKey(myIdenticalKey)) {
myIdenticalKey = dictionary.GetKeyEqualTo(myIdenticalKey);
}
// Use myIdenticalKey reference...
Obviamente, SortedDictionary não tem um "GetKeyEqualTo" método.Mas existe alguma maneira que eu poderia conseguir um efeito semelhante?Este seria, basicamente, tem o efeito de estagiário-ing a pesada chave de objetos para que instâncias idênticas poderia ser descartado.Eu sei que pode fazer isso usando a classe SortedList, recuperando a chave do índice e, posteriormente, correspondente instância de objeto, mas SortedDictionary consistente de inserção desempenho seria melhor para o meu usa.
Curto de iterar todos o dicionário chaves para procurar uma correspondência, ou a escrever o meu próprio BST classe, existe alguma forma para atingir esse fim com .LÍQUIDO incorporado em coleções?
Solução
Você pode alterar o seu valor objecto de int para uma classe ou struct que contém o valor e a chave original.Em seguida, para acessar a chave original você pode fazer:
dictionary[myIdenticalKey].OriginalKey
e para o valor de algo como:
dictionary[myIdenticalKey].Value
Outras dicas
Se você substituir Equals()
e GetHashCode()
no MyHugeType
com o código que determina se duas instâncias são o mesmo, então você não terá duplicado de chaves do dicionário.É isso o que você quer dizer?
Você poderia implementar o IEquatable
na interface da sua classe fundamental.Lá você especificar quando dois objetos da classe são iguais uns aos outros.Depois que você simplesmente testar a existência de uma entrada usando ContainsKey
e quando retorna true
você pode obtê-la usando o []
o operador.
Você também pode fornecer um IComparer
implementação para alcançar o mesmo resultado.