2010-02-04 22 views
5

Estoy pensando específicamente en la clase genérica HashSet<T>. Implementa varias interfaces, pero ninguna expone la semántica correcta de un conjunto. Específicamente, ninguno admite un método Add que devuelve bool. (ICollection<T> admite void Add, que se puede utilizar de forma abreviada). Estas interfaces tampoco son compatibles con las operaciones de conjunto común, como uniones e intersecciones. (Aunque debe decirse que algunas de estas operaciones están disponibles a través de las extensiones IEnumerable<T>.)¿Por qué no hay una interfaz "configurada" en .NET Framework?

Esto significa que la clase solo se puede usar como un conjunto con su implementación directa. Es decir, no puede hacer algo como esto:

ISet<int> = new HashSet<int>; 

No sé, de todos modos. Entonces, ¿qué motivó la decisión de dejar esto?

Quizás lo más importante es esto: incluso si puede convertir HashSet<T> en ICollection<T> y otros, pierde el valor semántico en la API que está exponiendo. Es decir, los consumidores de su API no tienen ninguna indicación de que estén trabajando con un conjunto. Entonces, mientras usted podría llamar al ICollection<T>.Add y pasar, las personas se sentirán confundidas si intentan agregar un artículo dos veces y no funciona. Una interfaz establecida daría a las personas las expectativas correctas.

+0

¿Qué 'ISet ' tiene que 'ICollection ' no tiene? –

+0

Oh, creo que veo ... un método 'Add' que devuelve un' bool', ¿eh? –

+0

@dan - no puede agregar duplicados a un conjunto. – UpTheCreek

Respuesta

8

Aunque no estoy seguro de por qué no ha llegado a la biblioteca de la clase base anterior, ISetes disponible en .NET 4.0, que está a solo unas semanas del envío. La interfaz tiene la mayoría de los métodos que esperaría en un conjunto. Estos son algunos de los métodos admitidos:

  • Añadir, Borrar, contiene, CopyTo, GetEnumerator, quitar (hereditaria)
  • ExceptWith
  • IntersectWith
  • IsSubsetOf
  • IsSupersetOf
  • superposiciones
  • UnionWith

Las colecciones HashSet y SortedSet implementan esta nueva interfaz.

+0

Oh, sí? Estupendo. – UpTheCreek

+1

En realidad, ni siquiera se me ocurrió verificar si estaría en .NET 4.0. Pensé que si no hubiera sido incluido por ahora, debe haber alguna razón para ello. :) Estaré esperando esto para proyectos futuros. –

Cuestiones relacionadas