Pregunta

La vieja pregunta

Mi entendimiento es que C# tiene, en cierto sentido, HashSet y set tipos.Entiendo lo que HashSet es.Pero, ¿por qué set es una palabra independiente?¿Por qué no cada conjunto es HashSet<Object>?

Nueva pregunta

¿Por qué C# no tiene genéricos Set tipo, similar a Dictionary tipo?Desde mi punto de vista, me gustaría tener un conjunto estándar de búsqueda/adición/supresión de rendimiento.No me importa mucho si es realizado con hashes o algo más.Así que ¿por qué no hacer un conjunto de clases que en realidad iba a ser implementado como una HashSet en esta versión de C#, pero tal vez algo diferente en una futura versión?

O por qué no al menos de la interfaz ISet?

Respuesta

Aprendí gracias a todos los que respondieron a continuación: ICollection implementa una gran cantidad de lo que usted esperaría de ISet.Desde mi punto de vista, sin embargo, ICollection implementa IEnumerable mientras que los conjuntos no tienen que ser enumerable --- ejemplo:conjunto de los números reales entre el 1 y el 2 (aún más, los juegos pueden ser generados de forma dinámica).Estoy de acuerdo que esto es un menor de edad despotricar, como 'normal programadores rara vez necesitan innumerables conjuntos.

Ok, creo que lo entiendo. HashSet era absolutamente destinado a ser llamado Set pero la palabra Set está reservado en algún sentido.Más específicamente, los creadores de .NET arquitectura quería tener un conjunto coherente (sic!) de clases de diferentes idiomas.Esto significa que cada nombre de la clase estándar no deben coincidir con cualquier palabra clave en la .NET languages.La palabra Set, sin embargo , se utiliza en VB.NET que en realidad es entre mayúsculas y minúsculas (es?) por desgracia, no hay lugar para el maneuvre allí.

Misterio resuelto :)

Epílogo

La nueva respuesta por Alex Y.enlaces a la Página de MSDN que describe el próximo .NET 4.0 interfaz de ISet que se comporta más o menos como yo pensaba que debería y es implementado por HashedSet.Final feliz.

¿Fue útil?

Solución

(Tu pregunta original sobre set ha sido respondida.Si mal no recuerdo, "conjunto" es la palabra con la mayoría de los diferentes significados en el idioma inglés...obviamente esto tiene un impacto en la informática también.)

Creo que está bien tener HashSet<T> con ese nombre, pero yo sin duda la bienvenida a un ISet<T> la interfaz.Dado que HashSet<T> sólo llegar .NET 3.5 (que en sí mismo era sorprendente) sospecho que eventualmente puede ser una colección más completa de la base de tipos.En particular, el equivalente de Java LinkedHashSet, que mantiene el orden de inserción, podría ser útil en algunos casos.

Para ser justos, el ICollection<T> interfaz realmente cubre la mayor parte de lo que usted quiere en ISet<T>, así que tal vez no es necesario.Sin embargo, se podría argumentar que el propósito fundamental de un conjunto (que es principalmente acerca de la contención, y sólo tangencialmente se trata de ser capaz de iterar sobre los elementos) no es exactamente la misma como una colección.Es difícil.De hecho, una verdad matemática puede ser iterable o contables - por ejemplo, usted podría tener "el conjunto de los números reales entre el 1 y el 2." Si usted tenía una precisión arbitraria de tipo numérico, el conde sería infinito y iterar sobre él no tendría ningún sentido.

Asimismo, la idea de "sumar" a un conjunto no siempre tiene sentido.Mutabilidad es un negocio difícil cuando nomenclatura colecciones :(

EDITAR:Bueno, en respuesta a la observación:la palabra clave set no es de ninguna manera un legado a hacer con Visual Basic.Es la operación que conjuntos de el valor de una propiedad, vs get que recupera de la operación.Esto no tiene nada que ver con la idea de un conjunto, como una operación.

Imagine que en lugar de las palabras clave eran en realidad fetch y assign, por ejemplo,

// Not real code!
public int Foo
{
    fetch
    {
        return fooField;
    } 
    assign
    {
        fooField = value;
    } 
}

Es el propósito claro no?Ahora el real equivalente en C# es justo

public int Foo
{
    get
    {
        return fooField;
    } 
    set
    {
        fooField = value;
    } 
}

Por ejemplo, si escribes:

x = y.Foo;

que va a utilizar el get parte de la propiedad.Si usted escribe:

y.Foo = x;

que va a utilizar el set parte.

Es que más claro?

Otros consejos

No hay Conjunto <T>. Esta publicación de blog del equipo BCL tiene muchos detalles sobre HashSet, incluida una discusión no totalmente concluyente sobre la inclusión de hash en el nombre. Sospecho que no a todos en el equipo de BCL les gustó la decisión de usar el nombre HashSet <=>.

La única razón para esto parece la falta de recursos para implementar esto idealmente en .NET 3.5.

.NET 4.0 incluirá ISet , así como su nueva implementación además de HashSet - SortedSet . Consulte los enlaces proporcionados a la biblioteca de MSDN: ya están disponibles en .NET 4.0 beta1.

set es un lenguaje de C# palabra clave que ha sido de alrededor desde la versión 1.0.Es se utiliza para definir el valor de la asignación de parte de una propiedad (y get se utiliza para implementar el valor de lectura de parte de una propiedad).En este contexto se debe entender la palabra " set " como un verbo, como en el establecimiento de un valor.

HashSet<T> es una particular aplicación del concepto matemático de un Conjunto.Fue introducido por primera vez en .NET 3.5.Esta entrada de blog por el Equipo de BCL explica más sobre el razonamiento detrás de él, así como algunas pistas de por qué el nombre es HashSet<T> y no sólo Set<T>: http://blogs.msdn.com/bclteam/archive/2006/11/09/introducing-hashset-t-kim-hamilton.aspx.

En el caso de HashSet<T> usted debe entender la palabra " set " como un sustantivo.

Set es una palabra clave reservada en VB.NET (es el equivalente a establecer en C #). VB.NET puede usar clases / métodos / etc. con el mismo nombre que las palabras clave, pero deben escribirse entre corchetes, lo cual es feo:

Imports Wintellect.PowerCollections 'PowerCollections contains a class called Set'
Public Class Test
    Private _myValue As Integer  

    Public Property MyValue() As Integer
        Get
            Return _myValue
        End Get
        Set ' Set as keyword'
            _myValue = value
        End Set
    End Property

    Public Function X As [Set](Of Integer)
        Dim a As New [Set](Of Integer) ' Set as class'
        Return a
    End Function

End Class

Ah derecha entiendo tu pregunta ahora
No estoy seguro que se puede 100% la necesidad de un ISet<T>.
Supongo que la pregunta es que hacer que ver como esencial el comportamiento de un conjunto?
Es de Agregar,Quitar, etc Contiene.Si es así, entonces ICollection<T> ya proporciona una interfaz para que.
Si el conjunto de operaciones tales como la Union, Intersect, etc entonces es que algo que debería considerar lo suficientemente genérico para abstracto a un contrato de estilo de ejecución?

Tengo que decir que no sé la respuesta correcta a este creo que es un tema de debate abierto y sospecho que el equipo de BCL puede terminar de poner algo como esto en una futura versión, sino que depende de ellos.Yo personalmente no lo veo como enorme pieza que falta de funcionalidad

Post Original

El BCL no tiene un Conjunto de la colección, al menos no que yo sepa.
Hay un par de 3ª fiesta libs como Iesi.Colecciones
HashSet<T> se introdujo en el .NET 3.5 para crear un fast set de colección yo.correo donde desea una colección sin duplicados.También tiene el típico conjunto de operaciones tales como la Unión y Combinación.Echa un vistazo en este enlace desde el equipo de BCL en HashSet

Normalmente el uso de la misma, donde antes tenía que usar List<T> y la comprobación de duplicados cuando se añade.
Adición de elementos a un HashSet<T> también puede ser significativamente más rápido de la Lista

Algunos detalles más:
Otra característica interesante de HashSet es que no lance una excepción si se intenta añadir un duplicado simplemente no se puede agregar la entrada duplicada, que le ahorra de tener que poner un montón de tratar.bloques catch alrededor de cada complemento agradable :)

Estoy bastante seguro de que no hay una clase Set<T> en el BCL, al menos en .NET 3.5 (y tampoco en .NET 4.0, al parecer). ¿Qué esperarías de la necesidad de tal clase, de todos modos?

HashSet<T> es en sí mismo una estructura de datos de conjunto común que usa códigos hash (el método GetHashCode de un objeto) para comparar elementos. Esta es simplemente una forma eficiente de implementar un tipo de conjunto. (Otros métodos para verificar la igualdad probablemente tendrían un rendimiento más bajo).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top