18

Esistono alcuni thread su Stack Overflow che riguardano l'implementazione di priority queues in .Net and C#.Perché il framework .Net non ha una classe di coda prioritaria?

Il mio problema è di natura più basilare: Perché non c'è una coda di priorità fuori dalla scatola nel framework .Net? Anche la libreria standard C++ ne ha uno.

+1

Una delle prime cose che ho notato passando da Java a C#. Nessuna coda prioritaria? Java aveva anche/ha sincronizzato le code di priorità. – Carra

+0

vedere anche http://stackoverflow.com/questions/102398/priority-queue-in-net –

risposta

12

C'è stata una domanda qualche tempo fa (why C# does allow non-member functions like C++) che ha spinto Eric Lippert a scrivere un blog post sui motivi per cui. In esso, spiega:

Mi viene chiesto "perché C# non implementa la caratteristica X?" tutto il tempo. La risposta è sempre la stessa: perché nessuno ha mai progettato, specificato, implementato, testato, documentato e spedito quella caratteristica. Tutte e sei queste cose sono necessarie per far accadere una caratteristica. Tutti costano enormi quantità di tempo, sforzi e denaro. Le funzionalità non sono a buon mercato e ci impegniamo molto per assicurarci di spedire solo quelle funzionalità che offrono i migliori vantaggi possibili ai nostri utenti, dati i nostri limiti di tempo, impegno e denaro.

ho sospetto che è probabilmente la risposta al perché Net non viene fornito con una coda di priorità - non c'era ma non abbastanza tempo, fatica, denaro, la domanda per implementare uno (?).

+2

Grazie, Adrian, ho letto quel post sul blog quando lo ha scritto. Mi interessa anche ascoltare le opinioni dei non-MS - è che la struttura dei dati non è effettivamente necessaria in un framework? è abbastanza banale da lasciare fuori per tutti gli altri sviluppatori da implementare da soli? ecc. Conosco il mio punto di vista, ma posso adeguarmi sulla base dell'input degli altri. :-) –

+3

Il tempo è una questione di priorità. Se dicono che non c'è abbastanza tempo, allora la domanda diventa: "Perché * non * include una coda di priorità, ma * fa * include xxx?" E xxx può essere qualcosa di meno usato di una coda di priorità. Non so, forse prendere xxx = HybridDictionary. Sono sicuro che hanno qualcosa che potrebbe essere lasciato fuori per trovare il tempo per la coda di priorità. –

+0

Sì, è proprio quello che intendevo, ma lo hai formulato meglio ... ;-) –

4

.NET 4.0 introduce una classe SortedSet<T>, insieme all'interfaccia ISet<T> implementata da SortedSet<T> e HashSet<T>. Questo renderà ovviamente più semplice implementare la tua classe PriorityQueue<T>.

Tuttavia, non esiste ancora un'interfaccia IQueue<T>, che ammetterebbe almeno la necessità di code di priorità o qualsiasi altra implementazione rispetto al BCL base Queue<T>. Allo stesso modo, non c'è IStack<T>.

Personalmente trovo questa mancanza di alcune di queste interfacce di base deludenti e miopi, soprattutto perché il costo di progettazione/specifica/implementazione/test/documentazione di estrarre un'interfaccia semplice da una classe esistente dovrebbe essere davvero molto basso.

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

Lì, vedere? L'ho fatto.

+1

Hai codificato l'interfaccia, ma per quanto riguarda la classe? Non ci sono molte interfacce in .Net che non hanno almeno un'implementazione. – cjk

+6

Questa interfaccia potrebbe essere utilizzata da code non enumerabili, come le code di comunicazione asincrone? Per quanto riguarda gli endpoint della coda, dovrebbero avere le proprie interfacce, in modo da poter fornire solo funzionalità push a una parte del codice e capacità di pull a un'altra? Il problema non è la scrittura di quelle 5 righe di codice, il problema è la progettazione in modo che nessuno si lamenta e produce il valore per il runtime .NET nel processo. –

+2

ck: vedere System.Collections.Generic.Queue Lasse: le raccolte asincrone/simultanee non hanno lo stesso contratto comportamentale, quindi non avrebbero bisogno di implementare l'interfaccia. Il mio punto è che l'atteggiamento del team BCL sembra essere che se forniscono solo un'implementazione di un costrutto, non c'è bisogno di un'interfaccia, che non è l'atteggiamento corretto. A PARER MIO. –