18

Hay algunos hilos en Stack Overflow relacionados con la implementación de priority queues in .Net and C#.¿Por qué el framework .Net no tiene una clase de cola de prioridad?

Mi problema es de naturaleza más básica: ¿Por qué no hay una cola de prioridad lista para usar en .Net Framework? Incluso la biblioteca estándar de C++ tiene una.

+1

Una de las primeras cosas que noté al pasar de Java a C#. ¿No hay cola de prioridad? Java incluso tenía/ha sincronizado colas de prioridad. – Carra

+0

ver también http://stackoverflow.com/questions/102398/priority-queue-in-net –

Respuesta

12

Hubo una pregunta hace un tiempo (why C# does allow non-member functions like C++) que provocó que Eric Lippert escribiera un blog post sobre los motivos. En él, explica:

Me preguntan "¿por qué C no implementa la función X?" todo el tiempo. La respuesta es siempre la misma: porque nadie diseñó, especificó, implementó, probó, documentó y envió esa característica. Las seis cosas son necesarias para que una característica suceda. Todos ellos cuestan grandes cantidades de tiempo, esfuerzo y dinero. Las características no son baratas, y hacemos todo lo posible para asegurarnos de que solo estamos enviando aquellas características que ofrecen los mejores beneficios posibles para nuestros usuarios, dado nuestro tiempo limitado, nuestro esfuerzo y nuestros presupuestos monetarios.

I sospechoso que es probablemente la respuesta a por qué .Net no se entrega con una cola de prioridad - no era simplemente no es suficiente tiempo, esfuerzo, dinero, la demanda para implementar una (?).

+2

Gracias, Adrian, leí esa publicación de blog cuando la escribió. También me interesa escuchar las opiniones de personas que no son de MS: ¿esa estructura de datos no es realmente necesaria en un marco? ¿Es lo suficientemente trivial dejar de lado a todos los demás desarrolladores para implementarlo por su cuenta? etc. Conozco MI punto de vista, pero puedo ajustarlo sobre la base de las opiniones de los demás. :-) –

+3

El tiempo es una cuestión de prioridades. Si dicen que no hubo suficiente tiempo, la pregunta es: "¿Por qué * no * incluye una cola de prioridad, pero * do * incluye xxx?" Y xxx puede ser algo menos utilizado que una cola de prioridad. No sé, tal vez tome xxx = HybridDictionary. Estoy seguro de que tienen algo que podría haberse omitido para hacer tiempo para la cola de prioridad. –

+0

Sí, eso es exactamente lo que quise decir, pero lo formuló mejor ... ;-) –

4

.NET 4.0 presenta una clase SortedSet<T>, junto con la interfaz de ISet<T> que se implementa por SortedSet<T> y HashSet<T>. Obviamente, esto simplificará la implementación de su propia clase PriorityQueue<T>.

Sin embargo, todavía no existe la interfaz IQueue<T>, que admitiría al menos la necesidad de colas de prioridad o cualquier otra implementación que no sea la BCL básica Queue<T>. Del mismo modo, no hay IStack<T>.

Personalmente encuentro que esta falta de algunas de estas interfaces más básicas es decepcionante y miope, especialmente porque el costo de diseño/especificación/implementación/prueba/documentación de extraer una interfaz simple de una clase existente debería ser muy bajo.

public interface IQueue<T> : IEnumerable<T>, ICollection, IEnumerable 
{ 
    T Dequeue(); 
    void Enqueue(T item); 
    T Peek(); 
} 

Allí, ¿ves? Lo he hecho.

+1

Has codificado la interfaz, pero ¿qué hay de la clase? No hay muchas interfaces en .Net que no incluyan al menos una implementación. – cjk

+6

¿Podría esa interfaz ser utilizable mediante colas no enumerables, como las colas de comunicación asincrónica? ¿Qué pasa con los puntos finales de la cola, en caso de que tengan sus propias interfaces, de modo que solo se pueda otorgar capacidad de inserción a una parte del código y capacidad de extracción a otra? El problema no es escribir esas 5 líneas de código, el problema es diseñarlo para que nadie se queje, y produce valor para el tiempo de ejecución de .NET en el proceso. –

+2

ck: vea System.Collections.Generic.Queue Lasse: las colecciones asíncronas/concurrentes no tienen el mismo contrato de comportamiento, por lo que no tendrían necesidad de implementar la interfaz. Mi punto es que la actitud del equipo BCL parece ser que si solo proporcionan una implementación de un constructo, no hay necesidad de una interfaz, que no es la actitud correcta. EN MI HUMILDE OPINIÓN. –

Cuestiones relacionadas