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?

Foi útil?

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.

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