Почему не 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