【问题标题】:Why is LinkedListNode Next property readonly?为什么 LinkedListNode Next 属性是只读的?
【发布时间】:2018-03-31 18:44:19
【问题描述】:

我一直在使用 C# 解决 LeetCode 问题,并在尝试将linkedlistnode 的下一个值设置为新节点时注意到一个问题,即 'property 或 indexer ......Next 不能分配给 -- 它是只读的'。我可以从节点的下一个读取,但 不能 将一个节点分配给一个节点的下一个。为什么 .NET 会出现这种情况?

var l1Value = l1 == null ? 0 : l1.Value;
var l2Value = l2 == null ? 0 : l2.Value;
var newNode = new LinkedListNode<int>((l1Value + l2Value + overflow) % 10);
start.Next = newNode; <------ red squiggly
start = start.Next; <------ no red squiggly

【问题讨论】:

  • Visual Studio 是一个 IDE,不是框架,也不是语言。它没有LinkedListNode,但.NET 有一个。请使用正确的术语
  • @CamiloTerevinto 添加了术语 IDE 和 .NET

标签: c#


【解决方案1】:

您应该在LinkedList 上使用AddBefore/AddAfter/AddFirst/AddLast 方法将元素添加到您的列表中。

我不知道 100%,但我假设 API 表面不允许您修改 LinkedListNodeNext 元素,因为这会让您得到奇怪的东西,例如循环、不完整的列表等。主要是造成不一致状态的事物。文档说LinkedList 不支持:

LinkedList&lt;T&gt; 类不支持可能使列表处于不一致状态的链接、拆分、循环或其他功能。该列表在单个线程上保持一致。 LinkedList&lt;T&gt; 唯一支持的多线程场景是多线程读取操作。

作者决定提供方法来完成常见的插入/删除操作并确保所有正确的事情发生,而不是使用 setter 公开低级 Next/Previous 属性。例如。他们确保NextPrevious 在每次插入/删除时都得到更新。如果他们允许您直接修改NextPrevious,则无法确保在必要时始终更新两者。您仍然可以完成您需要的工作,但它们限制了人们自己实施这些操作时出现错误的可能性。

【讨论】:

  • 不完全是。你应该做var list = new LinkedList&lt;int&gt;,然后当你想添加一个节点时,你可以做list.AddFirst(5)。而不是抓住作为列表头部的节点,您应该抓住并使用list 本身。
【解决方案2】:

Next 属性只有从 LinkedListNode 返回下一项的 getter。

我想你正在寻找start.List.AddLast(newNode)

希望有帮助,

【讨论】:

  • 这是 C# 的约定吗?我一直认为 start.Next = newNode 是在 LinkedList 中设置下一个节点的最佳方式
  • 这不是在 C# 中设置下一个节点的方法。您应该使用 AddLast()、AddBefore、AddAfter 等来设置节点。 @springathing
猜你喜欢
  • 2011-08-11
  • 1970-01-01
  • 2013-03-05
  • 2015-07-10
  • 2021-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-19
相关资源
最近更新 更多