c# - 为什么 it.current 在调试期间改变他的值?

标签 c# iterator ienumerable enumerator

我正在尝试使用以下方法获取特定索引处的元素:

public T GetElem(int index)
{
    var it = outerInstance.iterator();
    var i = 0;
    while (it.MoveNext() && i < index)
    {
        i++;
    }
    return it.Current;
}

我创建了自己的迭代器,它是outerInstance的内部类,在调试过程中,当前元素在减少,最后变成空。

我的测试是在控制台应用程序内进行的,如下所示:

Storage<int?> storage = new DynSLinkedList<int?>();
var ranked = new Ranked<int?>(storage);

if (ranked.IsEmpty())
{
    Console.WriteLine("is empty \n");
}

for (var i = 1; i <= 10; i++)
    ranked.Add(i);

if (!ranked.IsEmpty())
{
    Console.WriteLine("is not empty \n");
}

if (ranked.Size() == 10)
{
    Console.WriteLine("Size ok \n");
}

for (var i = 0; i <= 9; i++)
{
    var element = ranked.GetElem(i);
    if (element == 10 - i)
    {
        Console.WriteLine("get " + i + " elem ok \n");
    }
}

仅当 i=0 时,它才是正确的。

enter image description here

enter image description here

我尝试为 java 方法编写等效的内容:

@Override
public T getElem(int index) throws IndexOutOfBoundsException {
    RWIterator<T> it=support.iterator();
    int i=0;
    while (it.hasNext() && i<index){
        it.next();
        i++;
    }
    return it.next();
}

最佳答案

您的问题是您正在使用单个实例在 Ranked.GetElem 方法中进行迭代。第一次调用ranked.GetElem,传递0,迭代器将移动一步(it.MoveNext)。

此时迭代器已经指向列表中的第二个元素。下次您调用ranked.GetElem 并传递1 时,迭代器将进一步移动两个间距,最终返回第三个元素,而不是您期望的元素(第二个)。等等等等。

您需要更改正在采用的总体方法,或者重置 GetElem 方法内的迭代器,以便它始终从第一个元素开始。

试试这个(假设您正确实现 Reset() 方法):

public T GetElem(int index)
{
    var it = outerInstance.iterator();
    it.Reset();
    var i = 0;
    while (it.MoveNext() && i < index)
    {
        i++;
    }
    return it.Current;
}

关于c# - 为什么 it.current 在调试期间改变他的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30490807/

相关文章:

c# - button_click 在 TextBox 中按下 Return - ASP.NET

java - 在单个集合上使用 iterator.remove() 的多个线程返回快速失败迭代器

c# - 从 IEnumerable<ObservableCollection<T>> C# 中提取项目

c# - 这两个 LINQ 查询有什么区别?

c# - 将列表数据绑定(bind)到 GridView。 GridView 找不到我的属性!

c# - 覆盖 LINQ .Include(),可能吗?

c# - Mvc 4 添加带有脚手架的 Controller 给出错误 - "Unable to retrieve metadata..."

c# - 使用 .net 的 Telnet 连接

java - 故障安全迭代器的逻辑是什么?

c++ - shared_ptr 的容器,但使用原始指针进行迭代