Quelqu'un sait-il si il y a un bon équivalent à Java collection en c# ? Je sais que vous pouvez imiter un peu un jeu utilisant un
ou un `` de remplissage, mais en ignorant les valeurs, mais qui n’est pas une façon très élégante.
Réponses
Trop de publicités?Si vous utilisez .NET 3.5, vous pouvez utiliser `` . Il est vrai que .NET ne répondre aux ensembles ainsi comme Java fait cependant.
Le PowerCollections de Wintellect peut aider aussi.
HashSet<T>
Structure De Données
Le Cadre de la Classe de la Bibliothèque de l' HashSet<T>
structure de données a été introduit dans le .NET Framework 3.5. Une liste complète de la mise en œuvre de membres peut être trouvé à l' MSDN page de référence pour HashSet<T>
.
Tout d'abord, un ensemble est une liste qui ne peuvent pas contenir des valeurs en double. Il est plus ou moins calquée sur un ensemble mathématique, qui ne dispose que d'éléments uniques.
Bien qu'un HashSet<T>
est une liste d'éléments, il n'hérite pas de la IList
interface. Au lieu de cela il seulement hérite de l' ICollection
interface. Ce que cela signifie, c'est des éléments à l'intérieur d'un HashSet<T>
ne peut pas être consulté par le biais d'indices, seulement par un agent recenseur (qui est un itérateur).
En outre, depuis un HashSet<T>
est modélisé d'après un ensemble mathématique, certaines fonctions ont été mises en œuvre, telles que l' Union
, Intersection
, IsSubsetOf
, IsSupersetOf
. Ceux-ci peuvent venir dans maniable quand vous travaillez avec de multiples ensembles.
Une différence entre un HashSet<T>
et List<T>
, c'est que le hachage de l'ensemble de Add
méthode est une fonction booléenne qui renvoie true
d'un élément a été ajouté et false
si ce n'était pas (parce qu'il n'était pas unique).
Pourquoi ne pas List<T>
?
Depuis un HashSet<T>
est tout simplement une collection unique d'objets, vous pourriez vous demander pourquoi cela doit être une structure de données. Normal List<T>
pourrait avoir le même comportement en vérifiant si un objet est présent dans la liste avant de l'ajouter.
La réponse courte est la vitesse. Recherche dans le cadre d'un List<T>
devient très lent très rapide, comme d'autres éléments sont ajoutés. Un HashSet<T>
besoin d'une structure de conception qui permettra pour la recherche rapide et d'insertion des vitesses.
Repères
Nous allons comparer la performance de la vitesse d'un HashSet<T>
contre une List<T>
.
Chaque essai était composé de l'addition des entiers de 0 à 9 999 à chaque collection. Cependant, le mod 25 a été appliquée pour chaque entier. Mod 25 fait le maximum de types d'éléments 25. Depuis 10 000 éléments ont été ajoutés, cela a forcé les 400 collisions à se produire, donnant à la structure des données, la possibilité d'utiliser leurs algorithmes de recherche. Les temps ont été mesurés à 3 fois après 10 000 essais et une moyenne.
Ne payez pas trop d'attention sur le temps d'exécution des tests, car ils sont tributaires sur mon matériel, mais regardez comment ils se comparent les uns aux autres.
Average time [ms]
----------------------------
HashSet<T> 2,290
List<T> 5,505
Maintenant, nous allons rendre les éléments des objets au lieu de types primitifs. J'ai écrit un rapide Person
classe avec trois champs: Name
, LastName
, et ID
. Depuis je n'ai pas de toute façon spécifique pour comparer les objets, tous les éléments seront ajoutés sans collisions. Cette fois de 1 000 Person
des objets ont été ajoutés à chaque collection pour un seul essai. Le temps total de 3 séries de 1 000 essais ont été en moyenne.
Average time [ms]
----------------------------
HashSet<Person> 201
List<Person> 3,000
Comme vous pouvez le voir, la différence de temps d'exécution devient astronomique lors de l'utilisation des objets, faire l' HashSet<T>
avantageux.
J’utilise Iesi.Collections http://www.codeproject.com/KB/recipes/sets.aspx
Il est utilisé dans beaucoup de projets de l’OSS, tout d’abord, je suis tombée dessus dans NHibernate
Jetez un oeil à PowerCollections plus sur CodePlex. En dehors de la série et OrderedSet il a quelques autres types de collection utile comme Deque, MultiDictionary, sac, OrderedBag, OrderedDictionary et OrderedMultiDictionary.
Pour les collections de plus, il y a aussi la Bibliothèque de Collection générique de C5.