573 votes

C# définissez collection ?

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.

451voto

Jon Skeet Points 692016

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.

189voto

Leahn Novash Points 1151

123voto

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.

16voto

Chris Canal Points 3219

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

12voto

dpan Points 3286

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X