【问题标题】:Java's Enumeration translated to C# IEnumeratorJava 的 Enumeration 翻译成 C# IEnumerator
【发布时间】:2014-02-05 22:24:53
【问题描述】:

实际上,这看起来很简单,但我对此感到非常困惑。 Java 的枚举 hasMoreElements() 和 nextElement() 方法是相关的,但工作方式当然不同于 C# 的 IEnumerator MoveNext() 和 Current() 属性。但是我该如何翻译这样的东西呢?:

//class declaration, fields constructors, unrelated code etc.

private Vector atomlist = new Vector();

    public int getNumberBasis() {
    Enumeration basis = this.getBasisEnumeration();
    int numberBasis = 0;
    while (basis.hasMoreElements()) {
        Object temp = basis.nextElement();
        numberBasis++;
    }
    return numberBasis;
}


public Enumeration getBasisEnumeration() {
    return new BasisEnumeration(this);
}

    private class BasisEnumeration implements Enumeration {

    Enumeration atoms;

    Enumeration basis;

    public BasisEnumeration(Molecule molecule) {
        atoms = molecule.getAtomEnumeration();
        basis = ((Atom) atoms.nextElement()).getBasisEnumeration();
    }

    public boolean hasMoreElements() {
        return (atoms.hasMoreElements() || basis.hasMoreElements());
    }

    public Object nextElement() {
        if (basis.hasMoreElements())
            return basis.nextElement();
        else {
            basis = ((Atom) atoms.nextElement()).getBasisEnumeration();
            return basis.nextElement();
        }
    }

}

如您所见,枚举类的方法已重载,我认为在任何地方用 MoveNext 和 Current 替换 hasMoreElements 和 nextElement 都行不通……因为 basic.nextElement() 在 if- 中再次调用 hasMoreElements()否则声明。如果我用 MoveNext() 替换 hasMoreElements,代码将前进两次而不是一次。

【问题讨论】:

    标签: c# java translation enumeration ienumerator


    【解决方案1】:

    您确实可以自己实现IEnumerable,但它通常只用于C# 内部的练习。你可能会使用iterator method:

     IEnumerable<Atom> GetAtoms()
     {
        foreach(Atom item in basis)
        {
             yield return item;
        }
        foreach(Atom item in atoms)
        {
             yield return item;
        }
     }
    

    Enumerable.Concat

     IEnumerable<Atom> GetAtoms()
     {
         return basis.Concat(atoms);
     }
    

    【讨论】:

    • 谢谢,你能说得更具体一点吗? IE。告诉我这在代码的上下文中是如何工作的?
    • @harbm - 无论你在哪里获得迭代器,你都会使用类似的函数......如果你显示需要迭代器的代码,可能会将它更多地放在上下文中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-04
    • 2014-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多