首页 > 解决方案 > 子列表(链表)上的枚举器

问题描述

我正在尝试创建一个遍历链表中的子列表的枚举器。为此,我明确地跟踪了两个节点HeadTail绑定了子列表。我的目标是能够foreach在链表上调用循环,以遍历子列表的所有元素。

想做什么foreach

循环首先初始化一个枚举器,在我的foreach例子中,它使用所需的列表list和一个变量链表节点node,它将Value在循环期间从该节点询问。

循环初始化后,它会重复以下模式:

  1. 调用MoveNext()方法,该方法“增加”列表
  2. 检索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

标签: c#.net-corelinked-list

解决方案


你试过了吗:

public bool MoveNext()
{
    bool returnValue = node != list.Tail; 
    node = node.Next;
    return returnValue;
}

推荐阅读