C# Java的枚举转换为C IEnumerator
实际上,这似乎很简单,但我真的很困惑。Java的枚举hasMoreElements和nextElement方法是相关的,但工作方式不同于C的IEnumerator MoveNext和Current属性。但是我怎么翻译这样的东西呢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()
//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);
}