Pergunta

Estou usando um HashSet<T> para armazenar uma coleção de objetos.Esses objetos já possuem um ID exclusivo de System.Guid, então prefiro HashSet<> basta usar esse ID existente em vez de tentar descobrir como fazer o hash do objeto.Como substituo o hash da compilação e forço meu programa a usar o valor do ID da compilação como o valor do hash?

Diga também que conheço o Guid de um objeto no meu HashSet<>, existe uma maneira de obter um objeto de um HashSet<T> com base nisso Guid sozinho?Ou devo usar um dicionário.

Foi útil?

Solução

A HashSet<> não é baseado em um par chave/valor e não fornece acesso "por chave" - ​​é apenas um conjunto de valores exclusivos, usando o hash para verificar a contenção muito rapidamente.

Para usar um par chave/valor (para buscar por Guid mais tarde) a opção mais simples seria um Dictionary<Guid,SomeType>.O código hash existente em Guid deve ficar bem (embora se você precisasse (você não está aqui) você pode fornecer um IEqualityComparer<T> para usar para hash.

Outras dicas

Substituir o GetHashCode() método para o seu objeto.

Obviamente, há uma leve ruga aqui ... os guids são maiores que o INT32S, que .NET usa para hashcodes.

Por que você precisa substituir isso? Parece talvez uma otimização prematura.

Sim, basta usar um dicionário. Depois de desenvolver seu aplicativo, passe por uma fase de ajuste de desempenho, na qual você mede o desempenho de todo o seu código. Se e somente se essa função hash mostrar como sendo o seu maior dreno, você considera uma estrutura de dados mais com desempenho (se houver uma de qualquer maneira) :-)

Tente examinar System.KeyEdCollection. Ele permite incorporar o conhecimento do campo -chave na implementação da sua coleção.

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