gpt4 book ai didi

c# - 为什么 C# LinkedList.RemoveFirst() 不返回删除的值?

转载 作者:可可西里 更新时间:2023-11-01 08:44:32 26 4
gpt4 key购买 nike

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

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

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

在 Java 中,它将是:

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

不要误会我的意思;我并不是说 Java 更好。 C# 的 LinkedList 具有更多功能,只需将 Node 公开为公共(public)结构即可。我正在尝试了解设计选择。

最佳答案

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

在 Java 中,LinkedList<E>类实现了 Queue<E>接口(interface),它反射(reflect)了设计者的一个决定:“你知道吗?链表可以很容易地用作队列,所以我们不妨让它实现该接口(interface)。”您与 queue 交互的方式是从末尾弹出项目,然后,您知道,使用它们做某事(这意味着 Pop 很自然) - 返回弹出元素的类似操作)。

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

如果开发人员想要使用 LinkedList<T>作为一个queue(或deque),他/她很可能为他/她实际需要的数据结构选择了错误的实现(来自.NET观点)。

因此,本着“一个合适的函数应该只做一件事”的精神,BCL 的人们选择制作 LinkedList<T>.RemoveFirst这样做:删除第一个元素(类似于 List<T>.RemoveAt 只是删除指定索引处的元素并且不返回任何内容)。

我并不是说决定是对是错。我认为 Java 和 .NET 中标准链表类的不同接口(interface)只是反射(reflect)了链表是什么以及如何在这两个框架中使用的不同观点.

关于c# - 为什么 C# LinkedList.RemoveFirst() 不返回删除的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5982597/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com