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.
¿Has comprobado HashSet en 3.5?
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
.
La mejor implementación establecida que he visto es parte de las maravillosas colecciones de Power Wintellect: http://www.codeplex.com/PowerCollections .
La implementación del conjunto se puede encontrar aquí:
http://www.codeplex.com/PowerCollections/SourceControl/FileView.aspx?itemId=101886&changeSetId=6259
Tiene todas las operaciones establecidas esperadas (unión, intersección, etc.).
¡Espero que esto ayude!
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:
HashSet<T>
es lo más cercano que obtendrá.