Почему не c# LinkedList.RemoveFirst() возвращает удаленное значение?

есть ли какая-то идиоматическая, производительность или философия дизайна, почему операции RemoveFirst() и RemoveLast() LinkedList C#не возвращают удаленное значение?

прямо сейчас, если я хочу прочитать и удалить первое значение, я считаю, что заклинание:

LinkedList<string> list = ...;
...
string removed = list.First.Value;
list.RemoveFirst();

в Java это будет выглядеть так:

LinkedList<String> list = ...;
...
String removed = list.removeFirst();

Не поймите меня неправильно, я не пытаюсь сказать, что Java лучше. LinkedList C#имеет гораздо больше возможностей, просто предоставляя узел как общедоступный строить. Я пытаюсь понять выбор дизайна.

4 ответов


Я не могу дать однозначного ответа, так как я не могу читать мысли создателей LinkedList<T>. Что Я!--10-->can сказать.

в Java LinkedList<E> класс реализует Queue<E> интерфейс, который отражает решение со стороны дизайнеров: "знаете что? Связанный список можно легко использовать в качестве очереди, поэтому мы могли бы также реализовать этот интерфейс.- И то, как ты взаимодействуешь с очереди это, выскакивая элементы с конца, а затем, вы знай,используя их для чего-то (что означает, что это естественно для Pop-как операция для возврата элемента выскочил).

в .NET нет IQueue<T> интерфейс. В принципе, дизайнеры приняли другое решение: "Самая эффективная реализация поведения, подобного очереди, о которой мы знаем,-это простая круговая очередь на основе массива. Поэтому, если разработчикам нужна очередь, они должны использовать Queue<T> класс, что именно так."

если разработчик хочет использовать LinkedList<T> Как очереди (или очереди если на то пошло), скорее всего, он/она выбирает неправильную реализацию для структуры данных, которая ему/ей действительно нужна (с точки зрения .NET).

таким образом, в духе "правильная функция должна делать ровно одну вещь", люди BCL решили сделать LinkedList<T>.RemoveFirst сделайте именно это: удалите первый элемент (аналогично how List<T>.RemoveAt просто удаляет элемент по указанному индексу и возвращает ничего.)

Я не говорю, что любое решение правильное или неправильное. Я думаю, что различные интерфейсы стандартного класса связанного списка в Java и .NET просто отражают разные представления о том, что такое связанный список и и как он должен быть!--10 - >используется в двух рамках.


программист может не всегда хотеть возвращать первый узел при его удалении. Если RemoveFirst вернул узел и программисту он не нужен, все равно потребуется выделение и утилизация памяти. При необходимости сохранение первого узла (с помощью First свойство) и наличие отдельной функции удаления кажется более гибким, на мой взгляд.


вы рассматривали возможность использования очереди или коллекции стека вместо LinkedList? затем вы можете нажать и поп и получить желаемое поведение.


причина RemoveFirst и RemoveLast фактически не возвращает значение, что внутренне LinkedList<T> хранит узлы как LinkedListNode<T>. The