为什么C#LinkedList.RemoveFirst()没有返回删除的值?

Dil*_*nga 11 c# collections api-design

C#的LinkedList的RemoveFirst()和RemoveLast()操作是否有一些惯用的,性能或设计哲学的原因是没有返回删除的值?

现在,如果我想阅读并删除第一个值,我相信咒语是:

LinkedList<string> list = ...;
...
string removed = list.First.Value;
list.RemoveFirst();
Run Code Online (Sandbox Code Playgroud)

在Java中,它将是:

LinkedList<String> list = ...;
...
String removed = list.removeFirst();
Run Code Online (Sandbox Code Playgroud)

别误会我的意思; 我并不是说Java更好.只需将Node公开为公共构造,C#的LinkedList就有了更多的可供性.我想了解设计选择.

Dan*_*Tao 8

我无法给出明确的答案,因为我无法读懂设计师的思想LinkedList<T>.我说的是这个.

在Java中,LinkedList<E>该类实现了Queue<E>接口,它反映了设计者的决定:"你知道吗?链接列表可以很容易地用作队列,所以我们不妨让它实现该接口." 而你与队列交互的方式是从最后弹出项目,然后,你知道,它们用于某些东西(这意味着类似Pop操作返回弹出的元素是很自然的).

在.NET中,没有IQueue<T>接口.基本上,设计人员做出了不同的决定:"我们所知道的最有效的队列式行为实现是一个简单的基于数组的循环队列.因此,如果开发人员想要一个队列,他们应该使用这个Queue<T>类,就是这样."

如果开发人员想要将a LinkedList<T>用作队列(或者deque),那么他/她可能正在为他/她实际需要的数据结构选择错误的实现(从.NET的角度来看).

因此,本着"正确的函数应该完成一件事"的精神,BCL人员选择LinkedList<T>.RemoveFirst这样做:删除第一个元素(类似于如何List<T>.RemoveAt删除指定索引处的元素并且不返回任何内容).

我不是说这两个决定是对还是错.我认为Java和.NET中标准链表类的不同接口只是反映了链表什么以及如何在两个框架中使用它们的不同视图.