C# IEnumerable 等效于 java 迭代器的 next() 方法?

C# IEnumerable equivalent of next() method of java Iterator?

我发现 (here)一种在 c# 中模仿 Java 的迭代器方法的迭代器实现,但我不太确定如何在我的案例中使用它,或者如果有一个更简单的选项可以用 c# 的方式重写此方法。 原始 java 方法:

public RWIterator<T> search (T e){

    RWIterator<T> it =null;
    RWIterator<T> current = iterator();
    RWIterator<T> prev = iterator();
    boolean found=false;
    while(! found && current.hasNext()){
        T el=current.next();
        if (el.equals(e)) found = true;
        else prev.next();
    }
    if (found) {
        //Iterator<T> tmp = prev;
        //System.out.println("searched value is="+tmp.next());
        it = prev;
    }
    return it;
}

Where RWIterator extends java Iterator,看不懂prev的用法,卡在这了:

public RWIterator<T> Search(T e)
{

    RWIterator<T> it = null;
    RWIterator<T> current = Iterator();
    RWIterator<T> prev = Iterator();
    bool found = false;
    while (!found && current.GetEnumerator().MoveNext())
    {
        T el = current.GetEnumerator().Current;
        if (el.Equals(e)) found = true;
        else
        {
           //what should happen with prev.GetEnumerator().Current ?
        }
    }
    if (found)
    {
        //Iterator<T> tmp = prev;
        //System.out.println("searched value is="+tmp.next());
        it = prev;
    }
    return it;
}

C# 有 foreach 循环来访问 IEnumerables。可以使用 foreach.

访问具有 GetEnumerator 方法的每个对象

我认为您不应该尝试将 Java 直接翻译成 C#,因为底层概念存在一些差异。在 Java 中有 Iterators,在 C# 中有 IEnumerable 实现。然后使用 foreach 完成迭代。

public RWIterator<T> Search(T e)
{

    RWIterator<T> it = null;
    RWIterator<T> current = Iterator();
    RWIterator<T> prev = Iterator();
    bool found = false;
    // while (!found && current.GetEnumerator().MoveNext())
    foreach(T el in current)
    {
        // T el = current.GetEnumerator().Current;
        if (el.Equals(e)) found = true;
        else
        {
           //what should happen with prev.GetEnumerator().Current ?
        }
    }
    if (found)
    {
        //Iterator<T> tmp = prev;
        //System.out.println("searched value is="+tmp.next());
        it = prev;
    }
    return it;
}

可以使用GetEnumerator方法获取Enumerator的引用,然后可以使用MoveNext方法继续,使用Current 属性 访问您的元素:

var enumerator = getInt().GetEnumerator();
while(enumerator.MoveNext())
{
    int n = enumerator.Current;
    Console.WriteLine(n);
}

好的,伙计,你的搜索方法试图实现的目标是 运行 遍历迭代器,直到找到匹配项。然后它将 return 一个从此匹配开始的迭代器。这是您的方法的替代方法,可实现我刚才描述的内容:

public RWIterator<T> Search(T e)
{
    RWIterator<T> myIterator = Iterator();
    bool found = false;
    foreach (T element in myIterator)
    {
        if (found)
            yield return element;
        else if (element.Equals(e))
        {
            found = true;
            yield return element;
        }
    }
}