【问题标题】:C# IEnumerable equivalent of next() method of java Iterator?C# IEnumerable 等效于 java Iterator 的 next() 方法?
【发布时间】:2015-04-27 12:45:36
【问题描述】:

我发现 (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;
}

RWIterator 扩展 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;
}

【问题讨论】:

  • 你真正想要达到什么目的?这看起来也不是特别干净的 Java 代码......如果你能解释大局,它会更容易帮助你。
  • @Jon :这是一种框架,使用包 java.util 中的基本 Java 接口:Iterator 和 Iterable。类 Storage 实现了 Iterable 接口(此方法来自该接口) 还有一个抽象 IReference 对应于引用的逻辑定义。考虑到迭代器也是引用,因为它们对应于引用 def。因此,RWIterator 类扩展了 java.util 包中的 Iterator 和 IReference 两个接口。项目的重点是使用Decorator一个代理模式来获取专门的集合。
  • 我不禁觉得,如果您没有尝试混合使用 Java 和 .NET,您几乎肯定会得到更简洁的解决方案。目前尚不清楚RWIterator 是什么(RW 代表什么?)或search 是什么意思.. 虽然您可能可以以这种方式移植代码,但听起来并不就像这是个好主意。
  • (除此之外,当前的方法最终会读取存储空间两次,大概。这听起来不是一个好主意......)
  • 另外你应该只调用一次GetEnumerator()。通常,每次调用 GetEnumerator() 都会返回一个新的枚举数,该枚举数指向可枚举的开头。

标签: java c# iterator ienumerable


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    好的,伙计,您的搜索方法试图实现的是在整个迭代器中运行,直到找到匹配项。然后它将返回一个从这个匹配开始的迭代器。这是实现我刚才描述的方法的替代方法:

    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;
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      C# 有foreach-loop 来访问IEnumerables。每个具有GetEnumerator 方法的对象都可以使用foreach 访问。

      我认为您不应该尝试将 Java 直接翻译成 C#,因为在底层概念上存在一些差异。在 Java 中有 Iterators 的地方,在 C# 中有 IEnumerable-implementations。然后使用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;
      }
      

      【讨论】:

      • 我认为Iterator相当于IEnumerator,而不是IEnumerable(相当于Iterable
      • @juharr 当然,你是对的。但无论如何,这不是最好的答案,因为这个问题有点深入。
      猜你喜欢
      • 2011-01-29
      • 1970-01-01
      • 2011-10-13
      • 1970-01-01
      • 1970-01-01
      • 2017-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多