2014-02-05 59 views
-2

實際上,這看起來很簡單,但我對此非常困惑。 Java的枚舉hasMoreElements()和nextElement()方法是相關的,但當然與C#的IEnumerator MoveNext()和Current()屬性的工作方式不同。不過,我會怎麼翻譯這樣的事情?:將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類的方法重載,我不認爲有MoveNext方法和當前無處不在將工作更換的hasMoreElements和nextElement ......因爲basis.nextElement()再次在if-else語句中調用hasMoreElements()。如果我要用MoveNext()替換hasMoreElements,則代碼將前進兩次而不是一次。

回答

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 - 無論你獲得迭代器,你都會使用類似的函數......如果你顯示需要迭代器的代碼,可以將它放在更多的上下文中。 –