Existe-t-il une structure de données «Set» dans .Net?

Idéalement, je recherche une classe d’ensemble logique basée sur des modèles. Il aurait toutes les opérations standard telles que Union, Intersection, Etc. et les éléments dupliqués.

J’ai fini par créer ma propre classe de set basée sur le C # Dictionary – en utilisant simplement les Keys.

HashSet est à peu près le plus proche possible, je pense.

La meilleure mise en œuvre que j’ai vue fait partie des merveilleuses collections de puissance de Wintellect: http://www.codeplex.com/PowerCollections .

L’implémentation de l’ensemble peut être trouvée ici:
http://www.codeplex.com/PowerCollections/SourceControl/FileView.aspx?itemId=101886&changeSetId=6259
Il a toutes les opérations de jeu attendues (union, intersection, etc.).

J’espère que cela t’aides!

Non, il n’y en a pas un nativement dans le cadre. La plupart des projets utilisent une implémentation open source (nHibernate) appelée Iesi.Collections. Voici un article de CodeProject à ce sujet:

http://www.codeproject.com/KB/recipes/sets.aspx

Avez-vous vérifié le HashSet en 3.5?

Je ne pense pas que c # a quelque chose de construit, mais je sais que quelques implémentations flottent sur le net. Il y a aussi quelques bons articles sur ce genre de choses:

Ceci est la partie 6 d’une série sur la représentation efficace de la structure des données. Cette partie se concentre sur la représentation des ensembles en C #.

Une implémentation d’une collection de set
Une implémentation d’une classe d’ensemble
Encore une autre implémentation d’une classe d’ensemble

Et enfin…

J’ai en fait utilisé cette bibliothèque moi-même comme base d’une implémentation d’ensemble que j’ai faite il y a environ un an.

Voici une implémentation simple:

 public sealed class MathSet : HashSet, IEquatable> { public override int GetHashCode() => this.Select(elt => elt.GetHashCode()).Sum().GetHashCode(); public bool Equals(MathSet obj) => SetEquals(obj); public override bool Equals(object obj) => Equals(obj as MathSet); public static bool operator ==(MathSet a, MathSet b) => ReferenceEquals(a, null) ? ReferenceEquals(b, null) : a.Equals(b); public static bool operator !=(MathSet a, MathSet b) => !(a == b); } 

Exemple d’utilisation:

 var a = new MathSet { 1, 2, 3 }; var b = new MathSet { 3, 2, 1 }; var c = a.Equals(b); // true var d = new MathSet> { a, b }; // contains one element var e = a == b; // true 

Voir cette question pour savoir pourquoi cette approche a été considérée sur HashSet .