davidnarciso Posted April 9, 2012 at 02:42 PM Report #448220 Posted April 9, 2012 at 02:42 PM Boas, Gostaria de saber se o acesso a um elemento de um dicionário pode ou não ser feito directamente através da sua chave. No meu caso específico tenho o dicionário definido da seguinte forma: Dictionary<Ponto, Casa> casas_tabuleiro = new Dictionary<Ponto, Casa>(); Em que Ponto é apenas uma classe com 2 atributos int (X e Y), a maneira como estou a aceder neste momento é esta: Digamos que quero aceder então a uma casa a partir do seu ponto public void metodoTeste(Ponto P) { foreach (KeyValuePair<Ponto, Casa> casa in casas_tabuleiro) { if (casa.Key.X ==P.X && casa.Key.Y== P.Y) //acesso ao elemento com o determinado ponto.. } } Mas devido à grande quantidade de vezes que tenho de ter acesso a um elemento directamente através da sua chave o meu código esta-se a tornar um pouco confuso.. sugestões ? obrigado desde já 👍
petvetbr Posted April 9, 2012 at 03:23 PM Report #448236 Posted April 9, 2012 at 03:23 PM Sim, você pode acessar o valor simplesmente colocando algo assim: var valor =dictionario[chave]; então como você está querendo ficaria assim: casa_no_ponto= casas_tabuleiro[Ponto] Porém como você está lidando com objetos, você pode ter que implementar o IEqualityComparer na sua classe para isto funcionar, pois ao comparar dois objetos, se eles não forem da mesma instância, mesmo que todos os seus valores sejam iguais, o C# pode os considerar como diferentes, sem a implementação desta interface: http://msdn.microsoft.com/pt-br/library/system.collections.iequalitycomparer%28v=vs.90%29.aspx Fernando Lage Bastos - MCP/MCTS/MCPD
davidnarciso Posted April 10, 2012 at 08:41 PM Author Report #448453 Posted April 10, 2012 at 08:41 PM Ahhh isso explica o porque de não estar a conseguir aceder ao objecto através de uma dada chave, não pertencia a mesma instância.. vou já começar a implementar esta interface 🙂 muito obrigado pela resposta foi uma grande ajuda petvetbr valeu mesmo 👍 cumprimentos
davidnarciso Posted April 11, 2012 at 04:23 PM Author Report #448623 Posted April 11, 2012 at 04:23 PM já implementei a interface mas o erro persiste.. 🙂 não consigo aceder ao elemento, apesar de aplicar a interface IEqualityComparer<T>, que tem como membros de interface o gethashvalue e o equals.. apliquei a interface, mas não estou a perceber como é que isso iria resolver o meu problema, uma vez que para aceder ao elemento tenho de fazer Dicionario [CHAVE] em que chave é um objecto ponto (x,y) não seria obrigado a usar o ponto.equals ?? ou ele automaticamente compara todos as suas chaves com a que lhe forneci através do metodo equals desta interface ?? 😁 obrigado desde já e cumprimentos
rumbafum Posted April 11, 2012 at 05:12 PM Report #448627 Posted April 11, 2012 at 05:12 PM Eu diria que o problema pode estar na forma como o HashCode é calculado. Como é que tens isso neste momento? Existem uns quantos artigos sobre este tema, este pode interessar pela forma como calcula o Hash: http://stackoverflow.com/questions/263400/what-is-the-best-algorithm-for-an-overridden-system-object-gethashcode/263416#263416
petvetbr Posted April 11, 2012 at 08:56 PM Report #448679 Posted April 11, 2012 at 08:56 PM De uma olhada aqui também, talvez possa ajudar: http://msdn.microsoft.com/en-us/library/336aedhh%28v=vs.100%29.aspx http://www.codeproject.com/Articles/18714/Comparing-Values-for-Equality-in-NET-Identity-and Fernando Lage Bastos - MCP/MCTS/MCPD
davidnarciso Posted April 12, 2012 at 03:31 AM Author Report #448716 Posted April 12, 2012 at 03:31 AM Obrigado pelas respostas rumbafum e petvetbr 😁 Já consegui fazer o que queria com a vossa ajuda, tinha um erro que nao estava a dar conta, nao estava a adicionar a minha classe que implementava as interface de comparação ao constructor do dicionário ? Uma vez feito funcionou perfeitamente, está mesmo como pretendia.. uma coisa genial este hashcode agora que li como deve ser foi facil de perceber, isto vai melhorar mesmo muito o código que tenho 😁 obrigado pela ajuda pessoal 🙂 cumprimentos
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now