перебирая массив - PullRequest
       4

перебирая массив

2 голосов
/ 16 июня 2010

Итерирование, хотя массив не является проблемой, но что если я хотел бы увеличивать его только при вызове метода?

Я даже не уверен, сработает ли это, но есть ли более простой способ сделать это

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

Ответы [ 5 ]

5 голосов
/ 16 июня 2010

То, что вы хотите, это итератор

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;
}
3 голосов
/ 16 июня 2010

Вы можете попробовать это вместо:

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

В вашем коде есть ошибка, при которой "foo" возвращается только в первый раз.

foo
bar
something
else
here
                <-- oops!
bar
something
else
here
2 голосов
/ 16 июня 2010

Пример, который вы опубликовали, является в основном реализацией перечислителя, так что да, это будет работать.

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

2 голосов
/ 16 июня 2010

Если я понимаю, что вы хотите сделать, я полагаю, что все, что вам нужно сделать, это вызвать метод GetEnumerator () в массиве. Объект Enumerator имеет метод MoveNext (), который перемещается к следующему элементу в списке и возвращает true, если он работал, и false, если это не так. Вы читаете значение перечислителя с помощью свойства Current, и вы можете сбросить счетчик до 0 с помощью Reset

0 голосов
/ 01 июня 2015
int x=0;
while ( x<myArray.length){
    if(condition){
        x++;
        system.out.print(myArray[x]);
     }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...