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 mais le meilleur que je puisse trouver est 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é? P> p> hashset.unionwith code>, ce qui nécessiterait la Après la séquence d'appels: p>
3 Réponses :
Il y a un ReadonlyCollection , mais ce n'est pas une table de hachage. LINQ ajoute le Union méthode comme une extension. P>
Cette réponse a été écrite il y a quelque temps, et depuis lors, un ensemble de collections immuables a été introduit dans le < Strong> Réponse originale forte> p> Vous pouvez déployer votre propre méthode pour ceci: p> Utilisez-le comme ceci: p> < Pré> xxx pré> Vous pouvez également utiliser Mais, System.Collections.Imbutable code>
Espace de noms. P> Union code>
, mais pour obtenir un ensemble, vous devrez transmettre le résultat au Constructeur code> Constructeur: p>
hashset code> est mutable. Vous pouvez essayer d'utiliser Set immuable de F # . P> < P> Aussi, comme mentionné dans les commentaires de Erike , en utilisant
concat code> donne le même résultat et probablement mieux: p>
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 code> 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. / B) code>, puis matérialiser encore un autre
hashset code> lorsque vous
Union code> 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 code>? Les doublons sont supprimés! Je vous défierais de voir si le résultat est différent entre ceux-ci:
nouveau hashset
hashsetextensions code>)
nouveau hashset (nouveau hashset
concat code> sur plusieurs
ienumerable code> s et une fois b> compose d'un article unique
hashset code> 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!
Le nouveau Immutablecrections a:
immutablestack code> li>
-
immutaculablee code> li>
-
immutableliste code> li>
-
immutablesHashSet code> li>
-
immutatablesTrette code> li>
-
immutabledictionner code> li>
-
immutatablesAddictionddiction code> li>
ul> Plus d'infos ici P>
À propos de l'Union Ce test passe: p> xxx pré> p>
Cela peut également être associé Stackoverflow.com/questions/927181/Immutable-Collections