2010-06-15 238 views
2

迭代數組並不是一個問題,但是如果我只想在調用該方法時只增加數值,該怎麼辦?遍歷數組

林甚至不知道這會工作,但有沒有這樣做的更簡單的方法這個

int counter; 
    string[] myArray = {"foo", "bar", "something", "else", "here"}; 

    private string GetNext() 
    { 
     string myValue = string.Empty; 

     if (counter < myArray.Length) { 
      myValue = myArray [counter]; 
     } else { 
      counter = 0; 
     } 

     counter++; 

     return myValue; 
    } 
+0

我不知道我完全理解這個問題。 「我只想在方法被調用時才增加?」 – Meiscooldude 2010-06-15 20:17:19

+0

不確定我看到你真正要求的 - 除了初始化語句,除非有人打電話給你的方法,否則這些都不會被調用。除非你擔心有人可以修改GetNext函數的調用之間的計數器或數組內容... – 2010-06-15 20:19:38

回答

5

你需要的是一個迭代

private IEnumerable<String> myEnumarable() 
{ 
    foreach(string i in myArray) 
    { 
     yield return i; 
    } 
} 

但是隻調用myArray.GetEnumerator復位();具有相同的效果。

您可以使用它通過

string[] myArray = { "foo", "bar", "something", "else", "here" }; 
IEnumerator<String> myEnum; 

private string GetNext() //Assumes there will be allways at least 1 element in myArray. 
{ 
    if(myEnum == null) 
     myEnum = myArray.GetEnnumerator(); 
    if(!myEnum.MoveNext()) 
    { 
     myEnum.Reset(); 
     myEnum.MoveNext(); 
    } 
    return myEnum.Current; 
} 
2

如果我理解你想要做什麼,我相信所有你需要做的就是調用的GetEnumerator( )方法。枚舉器對象具有MoveNext()方法,該方法將移至列表中的下一個項目,如果它工作則返回true,如果沒有則返回false。你讀與Current財產枚舉值,並且可以將計數器爲0與Reset

3

你可以代替試試這個:

private string GetNext() 
{ 
    string result = myArray[counter]; 
    counter = (counter + 1) % myArray.Length; 
    return result; 
} 

您的代碼,其中「富」只返回第一次的錯誤。

 
foo 
bar 
something 
else 
here 
       <-- oops! 
bar 
something 
else 
here 
2

你發佈的例子基本上是一個枚舉器的實現,所以是的,它會工作。

string[] _array = {"foo", "bar", "something", "else", "here"}; 

IEnumerable<String> GetEnumarable() 
{ 
    foreach(string i in _array) 
     yield return i; 
} 

如果你想用一個自定義的數據結構來做到這一點還是希望把更多的邏輯,當移動到下一個元素(即延遲加載,流數據),可以實現IEnumerator接口自己。

public class EnumeratorExample : IEnumerator 
{ 
    string[] _array; 

    // enumerators are positioned before the first element 
    // until the first MoveNext() call. 
    int position = -1; 

    public EnumeratorExample(string[] array) 
    { 
     _array = list; 
    } 

    public bool MoveNext() 
    { 
     ++position; 
     return (position < _array.Length); 
    } 

    public void Reset() 
    { 
     position = -1; 
    } 

    object IEnumerator.Current 
    { 
     get { return Current; } 
    } 

    public string Current 
    { 
     get 
     { 
      try 
      { 
       return _array[position]; 
      } 
      catch (IndexOutOfRangeException) 
      { 
       throw new InvalidOperationException("Enumerator index was out of range. Position: " + position + " is greater than " + _array.Length); 
      } 
     } 
    } 
} 

參考
- IEnumerable Interface

0
int x=0; 
while (x<myArray.length){ 
    if(condition){ 
     x++; 
     system.out.print(myArray[x]); 
    } 
}