7
votes

Immutable ensemble dans .NET

Le .NET BCL a-t-il un type de jeu immuable? Je programmment dans un dialecte fonctionnel de C # et je voudrais faire quelque chose comme xxx

mais le meilleur que je puisse trouver est hashset.unionwith , ce qui nécessiterait la Après la séquence d'appels: xxx

Cette utilisation est très opérationnelle opaque, ce qui permet d'optimiser et de comprendre. Y a-t-il un meilleur moyen de le faire sans écrire un type de jeu de fonctionnalités personnalisé?


1 commentaires

3 Réponses :


0
votes

Il y a un ReadonlyCollection , mais ce n'est pas une table de hachage. LINQ ajoute le Union méthode comme une extension.


0 commentaires

5
votes

Mise à jour

Cette réponse a été écrite il y a quelque temps, et depuis lors, un ensemble de collections immuables a été introduit dans le System.Collections.Imbutable Espace de noms.

< Strong> Réponse originale

Vous pouvez déployer votre propre méthode pour ceci: xxx

Utilisez-le comme ceci: < Pré> xxx

Vous pouvez également utiliser Union , mais pour obtenir un ensemble, vous devrez transmettre le résultat au Constructeur Constructeur: xxx

Mais, hashset est mutable. Vous pouvez essayer d'utiliser Set immuable de F # . < P> Aussi, comme mentionné dans les commentaires de Erike , en utilisant concat donne le même résultat et probablement mieux: xxx


9 commentaires

Ce code ne garantit pas une imputabilité profonde. Si vous modifiez la structure définie (E.G. Qu'est-ce qui est contenu dans l'ensemble), la structure de jeu d'origine sera intacte. Mais si vous modifiez des éléments dans l'ensemble résultant, les éléments de l'ensemble d'origine seront également modifiés.


L'immuabilité profonde n'est garantie que dans C # si les éléments de l'ensemble sont immuables eux-mêmes. L'ensemble ne peut pas l'appliquer seul. De plus, le hashset est un ensemble mutable, alors peut-être que vous devriez peut-être rechercher d'autres classes en dehors de la BCL.


@ Merlynmorgan-Graham: l'état d'un ensemble immuable de certains types d'objets de classe est la collecte des identités des objets mentionnés ainsi. Si j'ai une liste de numéros d'identification de véhicule de cinq voitures imprimés sur du papier inviolable, il fera toujours référence aux cinq mêmes voitures. La liste ne doit pas être considérée comme indiquant quoi que ce soit sur l'endroit où les voitures sont, de quelle couleur ils sont, combien de miles qu'ils ont conduit, etc. Toutes ces caractéristiques des voitures sont mutables. Le fait que de nombreuses propriétés d'une voiture puissent changer, cependant, ne rend pas la liste des voitures moins immuables.


@ Jordão, SuperCat: À coup sûr. Je voulais juste préciser que la mise en place des articles dans "un type de jeu immuable" (comme l'OP demanda) ne les a pas rendus comme magiquement immuables. Il n'a pas posé cette question, mais je pense que c'est une pensée de suivi raisonnable pour quelqu'un qui n'était pas si familière avec l'immuabilité de .net.


@ Merlynmorgan-Graham: Oui, c'était un bon point pour clarifier :-)


Pourquoi ne voudriez-vous pas simplement faire nouveau hashset (A.CONCAT (B) .CONCAT (C)) et enregistrer le résultat de matérialisation A. / B) , puis matérialiser encore un autre hashset lorsque vous Union c?


@ Terike: Concat! = Union, ils se comportent différemment.


@ Jordão tu as raison, ils font quelque chose de différent! Mais que se passe-t-il lorsque vous mettez des duplicats dans un hashset ? Les doublons sont supprimés! Je vous défierais de voir si le résultat est différent entre ceux-ci: nouveau hashset (nouveau hashset {1, 2} .concat (nouveau hashset {2, 3})) vs. ( hashsetextensions ) nouveau hashset (nouveau hashset {1, 2} .Union (nouveau hashset {2, 3})); {2, 3})); . Ils ne sont pas différents - même résultat! En utilisant concat sur plusieurs ienumerable s et une fois compose d'un article unique hashset est moins de travail que de faire un article unique que de faire un article unique comparaison encore et encore pour chaque liste ajoutée.


@ Terike: En effet! J'ajouterai ça à la réponse. Merci d'avoir tapé ça!



14
votes

Le nouveau Immutablecrections a:

  • immutablestack
  • immutaculablee
  • immutableliste
  • immutablesHashSet
  • immutatablesTrette
  • immutabledictionner
  • immutatablesAddictionddiction

    Plus d'infos ici

    À propos de l'Union Ce test passe: xxx


0 commentaires