2014-02-05 2 views
-2

На практике это кажется простым, но я очень запутался в этом. Перечисление Java hasMoreElements() и методы nextElement() связаны друг с другом, но работают иначе, чем свойства IEnumerator MoveNext() и Current() класса C#, конечно. Но как бы я перевожу что-то вроде этого ?:Перечисление Java переводится на C# IEnumerator

//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(); 
     } 
    } 

} 

Как вы можете видеть, методы классовой enumration в перегружены, и я не думаю, что замена hasMoreElements и nextElement с MoveNext и тока везде будет работать ... потому что basic.nextElement() вызывает hasMoreElements() снова в инструкции if-else. Если бы я заменил hasMoreElements на MoveNext(), код будет продвигаться дважды, а не один.

ответ

0

Вы действительно можете реализовать 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); 
} 
+0

Спасибо, могли бы вы быть немного более конкретно? То есть скажите мне, как это работает в контексте кода? – harbm

+0

@harbm - вы должны использовать похожие функции везде, где вы получаете итераторы ... если вы показываете код, который нуждается в итераторах, возможно, его можно будет добавить в контекст. –

Смежные вопросы