C# Java的枚举转换为C IEnumerator

C# Java的枚举转换为C IEnumerator,c#,java,translation,enumeration,ienumerator,C#,Java,Translation,Enumeration,Ienumerator,实际上,这似乎很简单,但我真的很困惑。Java的枚举hasMoreElements和nextElement方法是相关的,但工作方式不同于C的IEnumerator MoveNext和Current属性。但是我怎么翻译这样的东西呢 //class declaration, fields constructors, unrelated code etc. private Vector atomlist = new Vector(); public int getNumberBasis()

实际上,这似乎很简单,但我真的很困惑。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和CurrentEverywhere替换hasMoreElements和nextElement是行不通的。。。因为basis.nextElement调用在if-else语句中再次包含更多元素。如果我用MoveNext替换hasMoreElements,代码将前进两次而不是一次

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


谢谢,你能再具体一点吗?也就是说,告诉我这在代码上下文中是如何工作的?@harbm-无论你在哪里得到迭代器,你都会使用类似的函数。。。若您显示需要迭代器的代码,那个么可以将其更多地放在上下文中。
 IEnumerable<Atom> GetAtoms()
 {
    foreach(Atom item in basis)
    {
         yield return item;
    }
    foreach(Atom item in atoms)
    {
         yield return item;
    }
 }
 IEnumerable<Atom> GetAtoms()
 {
     return basis.Concat(atoms);
 }