2010-06-15 6 views
2

L'écriture d'un tableau n'est pas un problème, mais que se passe-t-il si je ne veux incrémenter que lorsque la méthode est appelée?Itération dans un tableau

Im même pas sûr si cela fonctionne, mais est-il un moyen plus facile de le faire

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

Je ne suis pas sûr que je comprends complètement la question. "Je voulais seulement incrémenter seulement quand la méthode est appelée?" – Meiscooldude

+0

Je ne suis pas sûr de savoir ce que vous demandez vraiment - à l'exception des instructions d'initialisation, rien de tout cela n'est appelé à moins que quelqu'un appelle votre methond. Sauf si vous avez peur que quelqu'un puisse modifier le contenu du compteur ou du tableau entre les invocations de la fonction GetNext ... –

Répondre

5

Ce que vous voulez est un itérateur

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

Cependant, juste appeler myArray.GetEnumerator(); a le même effet.

Vous pouvez l'utiliser par

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

Si je comprends ce que vous voulez faire, je crois que tout ce que vous devez faire est d'appeler le GetEnumerator () sur le tableau. L'objet Enumerator possède une méthode MoveNext() qui passe à l'élément suivant de la liste et renvoie true si cela a fonctionné et false si ce n'est pas le cas. Vous avez lu la valeur de la recenseur avec la propriété Current, et vous pouvez remettre le compteur à 0 avec Reset

3

Vous pouvez essayer ceci:

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

Votre code a un bug où "foo" ne retourne la première fois.

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

L'exemple que vous avez posté est essentiellement une implémentation d'un énumérateur, donc oui cela fonctionnerait.

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

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

Si vous voulez faire cela avec une structure de données personnalisées ou si vous voulez mettre plus logique lors du passage à l'élément suivant (à savoir le chargement paresseux, les données en continu), vous pouvez mettre en œuvre la même interfacer IEnumerator.

Exemple

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

Références
- IEnumerable Interface

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