¿Alguien sabe si hay un buen equivalente a la Set
colección de Java en C #? Sé que puedes imitar un conjunto usando a Dictionary
o a HashTable
rellenando pero ignorando los valores, pero esa no es una forma muy elegante.
fuente
¿Alguien sabe si hay un buen equivalente a la Set
colección de Java en C #? Sé que puedes imitar un conjunto usando a Dictionary
o a HashTable
rellenando pero ignorando los valores, pero esa no es una forma muy elegante.
Prueba HashSet :
La clase HashSet (Of T) proporciona operaciones de conjuntos de alto rendimiento. Un conjunto es una colección que no contiene elementos duplicados, y cuyos elementos no están en un orden particular ...
La capacidad de un objeto HashSet (Of T) es la cantidad de elementos que el objeto puede contener. La capacidad de un objeto HashSet (Of T) aumenta automáticamente a medida que se agregan elementos al objeto.
La clase HashSet (Of T) se basa en el modelo de conjuntos matemáticos y proporciona operaciones de conjuntos de alto rendimiento similares al acceso a las teclas de las colecciones Diccionario (Of TKey, TValue) o Hashtable . En términos simples, la clase HashSet (Of T) se puede considerar como una colección Dictionary (Of TKey, TValue) sin valores.
Una colección HashSet (Of T) no está ordenada y no puede contener elementos duplicados ...
Si está utilizando .NET 3.5, puede usarlo
HashSet<T>
. Sin embargo, es cierto que .NET no atiende conjuntos tan bien como Java.Las Wintellect PowerCollections también pueden ayudar.
fuente
Si está utilizando .NET 4.0 o posterior:
En el caso de que necesite ordenar, use
SortedSet<T>
. De lo contrario, si no lo hace, úseloHashSet<T>
ya que esO(1)
para operaciones de búsqueda y manipulación. Mientras queSortedSet<T>
esO(log n)
para buscar y manipular operaciones.fuente
Yo uso Iesi.Collections http://www.codeproject.com/KB/recipes/sets.aspx
Se usa en muchos proyectos de OSS, lo encontré por primera vez en NHibernate
fuente
Utilizo un contenedor alrededor de un
Dictionary<T, object>
, almacenando nulos en los valores. Esto le da a O (1) agregar, buscar y eliminar en las teclas, y para todos los efectos, actúa como un conjunto.fuente
Echa un vistazo a PowerCollections en CodePlex. Además de Set y OrderedSet, tiene algunos otros tipos de colección útiles, como Deque, MultiDictionary, Bag, OrderedBag, OrderedDictionary y OrderedMultiDictionary.
Para más colecciones, también está la Biblioteca de colecciones genéricas C5 .
fuente
Sé que este es un hilo antiguo, pero me encontraba con el mismo problema y descubrí que HashSet era muy poco confiable porque, dado el mismo origen, GetHashCode () devolvió códigos diferentes. Entonces, pensé, ¿por qué no usar una Lista y ocultar el método de agregar como este?
Como List usa el método Equals únicamente para determinar la igualdad, puede definir el método Equals en su tipo T para asegurarse de obtener los resultados deseados.
fuente
List.Contains
es deO(n)
complejidad, lo que significa que suAdd
método ahora también se vuelveO(n)
complejo. Asumiendo que la colección interna no necesita ser redimensionada,Add
para ambosList
yHashMap
debe serO(1)
compleja. TLDR: Esto funcionará, pero es hacky y menos eficiente.