Я не могу дать однозначного ответа, поскольку не могу прочитать мысли дизайнеров LinkedList<T>
.То, что я могу сказать, таково:
В Java класс LinkedList<E>
реализует интерфейс Queue<E>
, который отражает решение со стороны дизайнеров: "Знаете что? Aсвязанный список можно легко использовать в качестве очереди, поэтому мы могли бы также использовать его для реализации этого интерфейса ».И способ, которым вы взаимодействуете с очередью , заключается в выталкивании предметов с конца, а затем, вы знаете, с использованием их для чего-то (что означает, что это естественно для Pop
-подобногооперация для возврата элемента () (
). В .NET нет интерфейса IQueue<T>
.По сути, дизайнеры приняли другое решение: «Наиболее эффективная реализация поведения, похожего на очередь, - это простая круговая очередь на основе массива. Поэтому, если разработчики хотят получить очередь, они должны использовать класс Queue<T>
, который точноэто. "
Если разработчик хочет использовать LinkedList<T>
в качестве очереди (или deque в этом отношении), скорее всего, он / она выбираетнеправильная реализация структуры данных, в которой он / она действительно нуждается (с точки зрения .NET).
Таким образом, в духе «правильная функция должна делать ровно одну вещь», люди BCL выбралиmake LinkedList<T>.RemoveFirst
делает именно это: удаляет первый элемент (аналогично тому, как List<T>.RemoveAt
просто удаляет элемент по указанному индексу и ничего не возвращает).
Я не говорю, что решение является правильным или неправильным.Я думаю, что различные интерфейсы стандартного класса связанного списка в Java и .NET просто отражают разные взгляды на то, что связанный список является и как он должен использоваться в двух рамках.