c# - 子列表(链表)上的枚举器
问题描述
我正在尝试创建一个遍历链表中的子列表的枚举器。为此,我明确地跟踪了两个节点Head
并Tail
绑定了子列表。我的目标是能够foreach
在链表上调用循环,以遍历子列表的所有元素。
想做什么foreach
:
循环首先初始化一个枚举器,在我的foreach
例子中,它使用所需的列表list
和一个变量链表节点node
,它将Value
在循环期间从该节点询问。
循环初始化后,它会重复以下模式:
- 调用
MoveNext()
方法,该方法“增加”列表 - 检索
Current
并返回到它被调用的地方
重复直到MoveNext() == false
。
我目前是如何编写我的枚举器的
由于第一步是移动,而不是返回一个值,我想我可以像这样初始化我的枚举器:
this.list = list;
this.node = list.Head.Previous // Initialize node to be the element before Head
Head
要显示的子列表的第一个元素在哪里。
然后,我尝试实现这样的MoveNext()
逻辑Current
:
public T Current => node.Value;
object IEnumerator.Current => Current;
public bool MoveNext()
{
node = node.Next;
return node != list.Tail.Next;
}
Tail
要显示的子列表的最后一个元素在哪里。
但在某些情况下,由于链表的这种实现是循环的,list.Tail.Next
可以是list.Head
,这意味着MoveNext()
它将返回false
,甚至没有机会返回单个值。
有没有办法重构枚举器以确保它迭代整个子列表而不是仅仅短路,无论何时list.Tail.Next
指向和不指向list.Head
?
解决方案
你试过了吗:
public bool MoveNext()
{
bool returnValue = node != list.Tail;
node = node.Next;
return returnValue;
}
推荐阅读
- python - 循环不执行时,defhealthindex 函数不发生
- python - 从没有导入子句的另一个文件调用函数?
- android - 尝试创建 navHostFragment 时出现 NullPointerException 错误
- javascript - ifttt过滤器替换字符串
- c# - 使用c#进行手机游戏开发
- apache-kafka - 卡夫卡流 | RocksDB 异常
- c# - 从单独的函数 C# WinForms 访问创建的 TabPage 中的控件
- arrays - 将方法调用中的 int[] 初始化为参数
- laravel - Laravel 从 localhost 的 url 中删除 public
- lua - 如何使用变量将 draw.RoundedBox 添加到 ax 位置?