18

Есть несколько потоков на переполнение стека, связанных с внедрением priority queues in .Net and C#.Почему класс .Net не имеет класса очереди приоритетов?

Моя проблема носит более простой характер: Почему нет очереди приоритетов в рамке .Net? Даже в стандартной библиотеке C++ есть одна.

+1

Одна из первых вещей, которые я заметил при переходе с Java на C#. Нет очереди с приоритетом? Java даже имеет/имеет синхронизированные очереди приоритетов. – Carra

+0

см. Также http://stackoverflow.com/questions/102398/priority-queue-in-net –

ответ

12

Был (а) задан вопрос (why C# does allow non-member functions like C++), который побудил Эрика Липперта написать blog post о причинах, почему. В нем он объясняет:

Меня спрашивают: «Почему C# не реализует функцию X?» все время. Ответ всегда один и тот же: поскольку никто не проектировал, не определял, не реализовывал, не тестировал, не документировал и не отправлял эту функцию. Все шесть из этих вещей необходимы, чтобы сделать функцию. Все они стоят огромного количества времени, усилий и денег. Особенности не являются дешевыми, и мы очень стараемся удостовериться, что мы отправляем только те функции, которые дают наилучшие преимущества нашим пользователям, учитывая ограниченное время, усилия и денежные бюджеты.

Я подозреваемый, что, вероятно, ответ, почему .Net не поставляется с приоритетной очереди - там просто не хватает времени, сил, денег, спрос реализовать один (?).

+2

Спасибо, Адриан, я прочитал этот пост в блоге, когда он его написал. Мне также интересно услышать мнения людей, не относящихся к MS, - это то, что структура данных фактически не нужна в рамках? достаточно ли тривиально, чтобы все остальные разработчики не могли реализовать самостоятельно? и т. д. Я знаю МОЮ точку зрения, но я могу настроить на основе ввода другого. :-) –

+3

Время - вопрос приоритетов. Если они говорят, что времени было недостаточно, возникает вопрос: «Почему * не * включает очередь приоритетов, но * do * include xxx?» И xxx может быть чем-то менее используемым, чем приоритетная очередь. Я не знаю, возможно, возьму xxx = HybridDictionary. Я уверен, что у них есть что-то, что можно было бы оставить, чтобы выделить время для очереди приоритетов. –

+0

Да, это именно то, что я имел в виду, но вы сформулировали это лучше ... ;-) –

4

.NET 4.0 вводит SortedSet<T> класс, наряду с интерфейсом ISet<T>, который осуществляется SortedSet<T> и HashSet<T>. Это, очевидно, упростит реализацию вашего собственного класса PriorityQueue<T>.

Однако до сих пор нет интерфейса IQueue<T>, который, по крайней мере, должен был бы признать необходимость очередей приоритетов или любой другой реализации, чем базовый BCL Queue<T>. Точно так же нет IStack<T>.

Лично я считаю, что некоторые из этих самых основных интерфейсов являются разочаровывающими и недальновидными, особенно потому, что стоимость разработки/спецификации/реализации/тестирования/документации для извлечения простого интерфейса из существующего класса должна быть очень низкой.

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

Там, смотри? Я сделал это.

+1

Вы закодировали интерфейс, но как насчет класса? В .Net не так много интерфейсов, которые не имеют хотя бы одной реализации. – cjk

+6

Будет ли этот интерфейс использоваться неперечислимыми очередями, например асинхронными очередями связи? Как насчет конечных точек очереди, должны ли они иметь свои собственные интерфейсы, чтобы вы могли дать только push-возможности для одной части кода, а возможность pull-to для другого? Проблема не в написании этих 5 строк кода, проблема заключается в ее разработке, так что никто не жалуется, и это создает ценность для среды выполнения .NET в этом процессе. –

+2

ck: см. System.Collections.Generic.Queue Lasse: асинхронные/параллельные коллекции не имеют одинакового контрактного поведения, поэтому им не нужно будет реализовывать интерфейс. Моя точка зрения заключается в том, что отношение команды BCL, по-видимому, состоит в том, что если они обеспечивают только одну реализацию конструкции, нет необходимости в интерфейсе, что не является правильным отношением. ИМХО. –