collection c# data-structures set

collection - hashset c#



¿Hay una estructura de datos "Establecer" en.Net? (6)

Idealmente, estoy buscando una clase de conjunto lógico con plantillas. Tendría todas las operaciones de conjunto estándar como Unión, Intersección, Etc. y colapsar elementos duplicados.

Terminé creando mi propia clase de conjunto basada en el Diccionario de C # <> - simplemente usando las Teclas.



Aquí hay una implementación simple:

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

Ejemplo de uso:

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

Consulte esta pregunta para HashSet por qué se consideró este enfoque en HashSet .



No creo que c # tenga nada incorporado, pero sé que hay un par de implementaciones flotando en la red. También hay algunos buenos artículos sobre este tipo de cosas:

Esta es la parte 6 de una serie sobre la representación eficiente de la estructura de datos. Esta parte se enfoca en representar conjuntos en C #.

Una implementación de una colección de conjuntos
Una implementación de una clase establecida
Otra implementación más de una clase establecida

Y finalmente...

De hecho, he usado http://www.codeproject.com/KB/recipes/sets.aspx como base de una implementación de conjunto que hice hace un año o más.


No, no hay uno nativamente en el marco. Existe una implementación de código abierto que la mayoría de los proyectos usan (es decir, nHibernate) llamada Iesi.Collections. Aquí hay un artículo de CodeProject al respecto:

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