Como posso controlar como um objeto é hash por um hashset
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.
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.