¿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.
¿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.
Respuestas:
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.
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, úselo HashSet<T>
ya que es O(1)
para operaciones de búsqueda y manipulación. Mientras que SortedSet<T>
es O(log n)
para buscar y manipular operaciones.
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
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.
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 .
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?
public class UniqueList<T> : List<T>
{
public new void Add(T obj)
{
if(!Contains(obj))
{
base.Add(obj);
}
}
}
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.
List.Contains
es de O(n)
complejidad, lo que significa que su Add
método ahora también se vuelve O(n)
complejo. Asumiendo que la colección interna no necesita ser redimensionada, Add
para ambosList
y HashMap
debe ser O(1)
compleja. TLDR: Esto funcionará, pero es hacky y menos eficiente.