2008-10-02 12 views
9

¿Qué recomendarías para la clase que necesita mantener una lista de enteros únicos?¿Clase .NET recomendada para una colección de enteros únicos?

Voy a querer agregar() enteros a la colección y también verificar la existencia, p. Contiene().

Sería bueno también obtenerlos en una lista como una cadena para la pantalla, es decir. "1, 5, 10, 21".

+1

Lo siento, no especifiqué. Puedo usar el último framework. 3.5 pero sus respuestas pueden ayudar a otros a no poder usar la última. –

Respuesta

24

HashSet:

La clase HashSet<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 ningún orden particular ...

La capacidad de un objeto HashSet<T> es la cantidad de elementos que el objeto puede contener. La capacidad de un objeto HashSet<T> aumenta automáticamente a medida que se agregan elementos al objeto.

La clase HashSet<T> se basa en el modelo de conjuntos matemáticos y proporciona operaciones de conjuntos de alto rendimiento similares para el acceso a las llaves de los Dictionary<TKey, TValue> o Hashtable colecciones. En términos simples, la clase HashSet<T> se puede considerar como una colección Dictionary<TKey, TValue> sin valores.

Una colección HashSet<T> no está ordenada y no puede contener elementos duplicados ...

+0

Miré el arraylist y ciertamente es mejor que el arraylist, así que eliminé mi respuesta anterior. – EBGreen

+1

HashSet va a ToString el tipo ... no es una lista. Y la lista que está mostrando es una de orden, que HashSet no admite. – MagicKat

+0

Correcto. Para obtener la lista de cadenas, debe usar un código como: int [] a = h.ToArray (); matriz.Ordenar (a); string.Join (',', a); Esto no es de alto rendimiento, pero me da la impresión de que no es una operación común, y es más para la depuración/visualización que para el cálculo. –

2

Si no puede utilizar .NET 3.5, entonces no se puede utilizar HashSet. Si ese es el caso, es fácil hacer la suya propia según la estructura del Diccionario.

public class Set<T> { 
    private class Unit { ... no behavior } 
    private Dictionary<T, Unit> d; 

.... 
} 

La unidad está destinada a ser un tipo con exactamente un valor. No importa lo que asigne los elementos a, solo use las teclas para saber qué hay en su conjunto. Las operaciones que solicitó en la pregunta son sencillas de implementar.

+1

¿Por qué incluso crear clases 'Unit'? El valor puede ser 'nulo'. –

+0

¿Cuál sería el tipo? "objeto"? – EfForEffort

+1

Sí, el diccionario funcionaría bien para esto. –

1

puede heredar una clase de KeyedCollection. De esta manera, su clave puede ser el valor en sí mismo, puede anular ToString para que obtenga el resultado deseado. Esto podría darle el comportamiento que desea/necesita.

Nota, esta respuesta fue para el marco 2.0 parte de la Q

3

En mis pruebas, he encontrado que un diccionario con un valor ficticio es más rápido que un HashSet, cuando se trata de grandes conjuntos de datos (100,000+ en mi caso). Espero que esto se deba a que el Diccionario te permite establecer una capacidad inicial, pero realmente no lo sé. En el caso que está describiendo, probablemente usaría el Diccionario si esperaba un gran conjunto de números, y luego (o como estaba agregando al Diccionario, dependiendo de la intención) iterar sobre él usando un generador de cadenas, para crear la cadena de salida.

Cuestiones relacionadas