2014-06-23 27 views
-1

我想了解如何使用IEnumerator接口及其用途。我有一個實現IEnumerator接口的類。一個字符串數組被傳遞給構造方法。關於IEnumerator接口的困惑

問題是當我執行代碼,然後陣列沒有正確列出。它應該按照"ali","veli","hatca"的順序執行,但它在控制檯上按此順序排列"veli","hatca"-1。我感到很困惑。我在這裏做錯了什麼?你能幫忙嗎?

static void Main(string[] args) 
{ 
    ogr o = new ogr(); 
    while (o.MoveNext()) 
    { 
     Console.WriteLine(o.Current.ToString()); 
    } 
} 

public class ogr: IEnumerator 
{ 
    ArrayList array_ = new ArrayList(); 
    string[] names = new string[] { 
     "ali", "veli", "hatca" 
    }; 

    public ogr() 
    { 
     array_.AddRange(names); 
    } 

    public void addOgr(string name) 
    { 
     array_.Add(name); 
    } 

    int position; 
    public object Current 
    { 
     get 
     { 
      if (position >= 0 && position < array_.Count) 
      { 
       return array_[position]; 
      } 
      else 
      { 
       return -1; 
      } 
     } 
    } 

    public bool MoveNext() 
    { 
     if (position < array_.Count && position >= 0) 
     { 
      position++; 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 

    public void Reset() 
    { 
     position = 0; 
    } 
} 

回答

5

IEnumerator起初很難掌握,但幸運的是它本身幾乎不會用到的界面。相反,您應該實施IEnumerable<T>

然而,你的問題的根源來自於這條線從IEnumerator的文檔:

最初,枚舉位於 集合中的第一個元素之前。重置方法還使枚舉器返回到 這個位置。在創建枚舉器或調用Reset方法爲 後,必須先調用MoveNext方法將枚舉數前移到集合的第一個元素 ,然後再讀取 Current的值;否則,Current是未定義的。

您的實現的當前位置初始爲0,而不是-1,導致奇怪的行爲。您的枚舉數從第一個元素上的Current開始,而不是在它之前。

5

人們很少直接使用該API。更常見的是,它只是通過foreach語句中使用,即

foreach(var value in someEnumerable) { ... } 

其中someEnumerable實現IEnumerableIEnumerable<T>或只鴨類型的模式。您的班級ogr當然不是IEnumerator,不應該使其嘗試像一個。

如果打算是ogr枚舉,則:

public ogr : IEnumerable { 
    IEnumerator IEnumerable.GetEnumerator() { 
     return array_.GetEnumerator(); 
    } 
} 

我懷疑這將是更好的爲IEnumerable<string>,雖然使用List<string>爲後盾列表:

public SomeType : IEnumerable<string> { 
    private readonly List<string> someField = new List<string>(); 
    public IEnumerator<string> GetEnumerator() 
    { return someField.GetEnumerator(); } 

    IEnumerator IEnumerable.GetEnumerator() 
    { return someField.GetEnumerator(); } 
}