C#的LinkedList的RemoveFirst()和RemoveLast()操作是否有一些惯用的,性能的或设计哲学的原因是不会返回删除的值?
现在,如果我想阅读并删除第一个值,我相信咒语是:
LinkedList<string> list = ...;
...
string removed = list.First.Value;
list.RemoveFirst();
在Java中,它将是:
LinkedList<String> list = ...;
...
String removed = list.removeFirst();
别误会我的意思;我并不是说Java更好。只需将Node作为公共构造公开,C#的LinkedList就有了更多的功能。我想了解设计选择。
我无法给出明确的答案,因为我无法读懂设计师的思想 LinkedList<T>
。我是什么 能够 说是这样的。
在Java中, LinkedList<E>
class实现了 Queue<E>
接口,它反映了设计师的决定:“你知道吗?链接列表可以很容易地用作队列,所以我们不妨让它实现该接口。”和你互动的方式 队列 是通过弹出物品,然后,你知道, 运用 他们的东西(这意味着它是自然的 Pop
-like操作返回弹出的元素)。
在.NET中,没有 IQueue<T>
接口。基本上,设计人员做出了不同的决定:“我们所知道的最有效的队列式行为实现是一个简单的基于数组的循环队列。所以如果开发人员想要一个队列,他们应该使用 Queue<T>
上课,就是这样。“
如果开发人员想要使用 LinkedList<T>
作为一个 队列 (或者 双端队列 就此而言,他/她可能正在为他/她实际需要的数据结构选择错误的实现(从.NET的角度来看)。
因此,本着“适当的功能应该做到一件事”的精神,BCL人们选择了 LinkedList<T>.RemoveFirst
做到这一点:删除第一个元素(类似于如何 List<T>.RemoveAt
只是删除指定索引处的元素并且不返回任何内容)。
我不是说这两个决定是对还是错。我认为Java和.NET中标准链表类的不同接口只是反映了链表的不同视图 是 以及它应该如何 用过的 在两个框架内。
程序员可能并不总是希望在删除它时返回第一个节点。如果 RemoveFirst
返回节点并且程序员不需要它,它仍然需要内存分配和处理。可选地存储第一个节点(使用 First
在我看来,具有单独的删除功能似乎更灵活。
您是否考虑过使用Queue或Stack集合而不是LinkedList?然后,您可以按下并弹出并获得您想要的行为。
原因 RemoveFirst
和 RemoveLast
实际上并没有返回值是内部的 LinkedList<T>
将节点存储为 LinkedListNode<T>
。该 LinkedListNode
对象有一个概念 Next
和 Previous
但是如果从父集合中删除对象,这些属性指向哪里?