C # equivalente de Java IdentityHashMap




Tanto quanto eu sei, não há nenhum equivalente direto em C #. Minha idéia atual é usar um dicionário com um IEqualityComparer costume, que verifica a igualdade de referência.


No entanto, isso parece perder a vantagem obtida por hash. Existe uma maneira de obter um código hash individuais de cada objeto diferente? Ou isso é impossível e que eu deveria usar alguma outra abordagem?
Você pode usar [`RuntimeHelpers.GetHashCode(object)`](http://msdn.microsoft.com/en-us/library/11tbk3h9.aspx)o que exige `object.GetHashCode()`não virtualmente - este é o equivalente a `System.identityHashcode`em Java. Eu acho que é isso que você está depois. Portanto, o seu `IEqualityComparer`iria usar apenas que para hash e`object.ReferenceEquals` de igualdade.
<p>aqui está uma versão que funciona em c/c++ que não depende de tamanhos inteiros ou tem o problema de estouro (ou seja, x * y&gt; = 0 não funciona)</p><pre><code>bool samesign(int x, int y) { return (x &gt;= 0) ^ (y &lt; 0); } </code></pre><p>claro, você pode dar uma olhada e criar um modelo:</p><pre><code>template &lt;typename valuetype&gt; bool samesign(typename valuetype x, typename valuetype y) { return (x &gt;= 0) ^ (y &lt; 0); } </code></pre><p>nota: como estamos usando exclusive ou, queremos que o lhs e o rhs sejam diferentes quando os sinais forem os mesmos, portanto, a verificação diferente será zero.</p> <p>guilherme, bom dia!</p>
<p>no caso de uma variável anônima no c# não se trata de code smell pq a linguagem trabalha com inferência de tipo e o compilador assume logo na atribuição o tipo da classe. é na verdade para o c# uma facilidade. já para outras linguagens pode ser um code smell.</p>
<p>se consegui responder sua questão, marque a resposta como solucionada, por favor!
obrigado!</p> <p>o randomart deve ser uma maneira mais fácil para os humanos validarem as chaves.</p><p>a validação é normalmente feita por uma comparação de sequências sem sentido (isto é, a representação hexadecimal da impressão digital da chave), que os humanos são bastante lentos e imprecisos na comparação. o randomart substitui isso por imagens estruturadas que são mais rápidas e fáceis de comparar.</p><p>este documento <a href="http://www.ece.cmu.edu/~adrian/projects/validation/validation.pdf">&quot;hash visualization: uma nova técnica para melhorar a segurança do mundo real&quot;, perrig a. e song d., 1999, workshop internacional sobre técnicas criptográficas e e-commerce (cryptec '99) &quot;</a> explica algumas técnicas e vantagens.</p> <pre><code>for (iterator&lt;string&gt; i = someiterable.iterator(); i.hasnext();) { string item = i.next(); system.out.println(item); } </code></pre><p>note que se você precisar usar <code>i.remove();</code> no seu loop, ou acessar o iterador real de alguma forma, você não pode usar o idioma <code>for ( : )</code>, já que o iterador é meramente inferido.</p><p>como foi observado por denis bueno, este código funciona para qualquer objeto que implemente a interface <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/iterable.html"><code>iterable</code></a> .</p><p>além disso, se o lado direito do idioma <code>for (:)</code> for um objeto <code>array</code> em vez de <code>iterable</code>, o código interno usará um contador de índice int e verificará <code>array.length</code>. veja o <a href="http://docs.oracle.com/javase/specs/jls/se8/html/jls-14.html#jls-14.14.2">java language specification</a> .</p> <p>não tem muita diferença nao. o que muda é o retorno ser int ou integer. 
agora é uma questão pessoal.. eu não uso apenas objetos. em muitos casos eu uso primitivos.</p> <ul> <li>permite que você escreva códigos/use métodos de biblioteca que sejam seguros para o tipo, ou seja, uma lista &lt;string&gt; é garantida como uma lista de strings.</li> <li>como o uso de genéricos, o compilador pode executar verificações em tempo de compilação do código para segurança de tipo, ou seja, você está tentando inserir um int nessa lista de cadeias? usar um arraylist causaria um erro de tempo de execução menos transparente.</li> <li>mais rápido do que usar objetos, pois evita boxe/unboxing (onde .net precisa converter <a href="https://stackoverflow.com/questions/5057267/what-is-the-difference-between-a-reference-type-and-value-type-in-c">tipos de valor para tipos de referência ou vice-versa</a> ) ou converter objetos para o tipo de referência necessário.</li> <li>permite escrever código aplicável a muitos tipos com o mesmo comportamento subjacente, ou seja, um dictionary &lt;string, int&gt; usa o mesmo código subjacente que um dictionary &lt;datetime, double&gt;; usando genéricos, a equipe de estrutura precisou escrever apenas um trecho de código para alcançar os dois resultados com as vantagens mencionadas acima.</li> </ul> <p><strong>principais diferenças:</strong></p><ul> <li> <p>ambos scala e f # combinam programação imperativa de oo e programação funcional em uma linguagem. porém, sua abordagem para a unificação de paradigmas é muito diferente. scala tenta <em> funde </em> os dois paradigmas em um (chamamos de paradigma funcional do objeto), enquanto f # fornece os dois paradigmas lado a lado.por exemplo, tipos de dados algébricos em f # são construções puramente funcionais sem oo'ness nelas, enquanto os adts em scala ainda são classes e objetos regulares. (observação: no processo de compilação para o bytecode do clr, até mesmo os ft adts se tornam classes e objetos)). mas eles não são visíveis para o programador f # no nível da fonte.)</p> </li> <li> <p>o f # possui inferência completa do tipo hindley-milner. scala possui inferência parcial de tipo. o suporte para subtipagem e oo-pura) torna impossível a inferência de tipo de estilo hindley-milner para o scala.</p> </li> <li> <p>scala é uma linguagem muito mais minimalista que o f #. scala possui um conjunto ortogonal muito pequeno de construções que são reutilizadas em todo o idioma. o f # parece introduzir uma nova sintaxe para cada pequena coisa, tornando-se muito pesado quanto à sintaxe em comparação com o scala. (scala tem 40 palavras-chave, enquanto f # tem 97. isso deve lhe dizer uma coisa. :-)</p> </li> <li> <p>f # sendo uma linguagem da microsoft tem um excelente suporte ide na forma do visual studio. as coisas não são tão boas no lado scala. o lado do scala $ . o plugin eclipse ainda não é o mesmo vale para o plug-in netbeans. idea parece ser a sua melhor aposta no momento, apesar de nem sequer chegar perto do que você recebe java ides. (para os fãs do emacs, existe o ensime. ouvi muitas coisas boas sobre este pacote, mas ainda não o testei.)</p> </li> <li> <p>o scala possui um sistema do tipo muito mais poderoso (e complexo) que o f #.</p> </li> </ul><hr><p><strong>outras diferenças:</strong></p><ul> <li> <p>as funções f # são exibidas por padrão. em scala, o curry está disponível, mas não é usado com muita frequência.</p> </li> <li> <p>a sintaxe do scala é uma mistura da java, standard ml, haskell, erlang e muitas outras linguagens. a sintaxe do f # é inspirada nos de ocaml, c # e haskell.</p> </li> <li> <p>o scala suporta tipos e classes superiores. f # não.</p> </li> <li> <p>scala é muito mais acessível a dsls que f #.</p> </li> </ul><hr><p>ps: eu amo ambos scala e f #, e espero que eles se tornem idiomas predominantes de suas respectivas plataformas no futuro. :-)</p> <p>a melhor ferramenta disponível é o fireworks. sou bastante avançado na maioria das suítes cs e devo dizer que, para o design de interface, nada supera o fireworks.</p> resumindo aqui a resposta que demos em aula: essas duas são mesmo as melhores opções e o uso depende muito de qual o seu objetivo. se você quiser capturar o erro e agir sobre ele, melhor a trycatch(); nas outras situações é melhor a possibly().

nossa única outra recomendação é evitar ao máximo o us… <p>oi,</p>
<p>acho que os patterns <code>command</code> e <code>observer</code> seriam os mais apropriados para esse caso.</p>