Как перебирать и выполнять разные операторы, пока условие истинно?

Есть ли способ иметь разные операторы для каждого цикла через некоторое время или для цикла? Пример: у меня есть массив int, длина n, и я хочу добавить разные конкретные значения (конечно, одного и того же типа) в каждый индекс...

так что, когда индекс равен n-1, он останавливается. Я знаю, как это сделать, если их несколько утверждений, но что, если нужно добавить 100 конкретных значений.

Более конкретно:

public static int[] ArrayPlay(int n) 
{ 
    int[] arr = new int[n]; 
    while (arr[x] < n) 
    arr[0] = 3; 
    arr[1] = 12; 
    arr[2] = 176; 
    arr[3] = 4;
    //so on...
    return arr;
} 

будет выглядеть примерно так:

public static int[] ArrayPlay(int n)//4
{
    int a = 0;
    int[] arr = new int[n];
    while ( a <= n)  //lets say n is 4
        arr[a] = 3;  //arr[0]
    a++;
        arr[a] = 12; //arr[1]
    a++;
        arr[a] = 4;  //arr[2]
    a++;
        arr[a] = 8;  //arr[3] 
    a++;             //(a=4 Stop!  and return arr)
        arr[a] = 7;
    a++;
        arr[a] = 12;
    a++;
        arr[a] = 22;
    a++;
        arr[a] = 18;

    return arr;
}

он никогда не переходит к a++, потому что первое утверждение всегда истинно.

Есть ли способ сломать, проверить условие и продолжить между каждым оператором? и какое свойство или метод проверить индекс массива nr (где я написал arr[x]), где x — значение, которое нужно сравнить с n.

public static int[] ArrayPlay2(int n)//4
{

    int[] arr = new int[n];
    for (int a = 0; a < arr.Length; a++)
    {
        arr[a] = 3;  //arr[0]
        arr[a] = 12; //arr[1]
        arr[a] = 4;  //arr[2]
        arr[a] = 8;  //arr[3] (a=4 Stop!  and return arr)
        arr[a] = 7;
        arr[a] = 12;
        arr[a] = 22;
        arr[a] = 18;

    }
    return arr;
}

Почему код выше не работает??


person Matilda    schedule 18.03.2016    source источник
comment
Что означает there are 100 specific value to be added? Просто неясно, чего вы пытаетесь достичь, поэтому трудно помочь. Но что говорит против if или switch?   -  person Tim Schmelter    schedule 18.03.2016
comment
Не используйте массивы. Вместо этого используйте List‹›, где вы можете просто добавить в конец, а не с массивами, где вы должны указать размер массива при его построении.   -  person jdweng    schedule 18.03.2016
comment
Хватит говорить о циклах, операторах if, условиях. Объясните простым языком, что вы хотите сделать.   -  person Lasse V. Karlsen    schedule 18.03.2016
comment
Я хочу заполнить массив до 30 конкретных значений (элементов), количество элементов зависит от аргумента int n, потому что он определяет длину массива.   -  person Matilda    schedule 18.03.2016


Ответы (4)


Похоже, вы просто пытаетесь скопировать часть массива.

// TODO: Handle the case "n > magicIntegers.Length" how you see fit.
int[] magicIntegers = new int[] { 3, 12, 4, 8, 7, 12, 22, 18 }; // etc.
int[] copiedArray = new int[n];
return Array.Copy(magicIntegers, 1, b, 0, n);
person Shelby115    schedule 18.03.2016

В вашем коде есть ошибка - в то время как будет делать только arr[0] = 3; или это то, что вы пытаетесь сделать?

Если вы пытаетесь перебрать все элементы, почему бы просто не использовать:

int[] arr = new int[n];
foreach (int i in arr)
{
}

Если вы пытаетесь выполнить это, возможно:

for (int i = 0; i < arr.Length; i++)
{
     arr[i] = ...
}

Я полагаю, вы неправильно понимаете, как работает цикл: arr[a] = 3; //arr[0], arr[a] = 12; //arr[1] и arr[a] = 4; //arr[2] все еще находятся внутри одного цикла, поэтому a по-прежнему является одним единственным числом. Он увеличивается на a++, который вы написали в части for (int a = 0; a < arr.Length; a++).

person makro88    schedule 18.03.2016
comment
Я знаю, я переписал свой вопрос, чтобы он сосредоточился на моей основной проблеме, как заставить мой цикл условий передать arr[0]=3 в a++, а затем снова и снова проверять условие после каждого утверждения. - person Matilda; 18.03.2016
comment
Посмотрите на мое редактирование. Вероятно, это объясняет, в чем вы не правы. - person makro88; 18.03.2016

Вы можете использовать исходный массив, который содержит все возможные значения, и скопировать только необходимое число в новый.

С linq это довольно просто:

public static int[] ArrayPlay(int n)
{
    return new []{ 3, 12,4, 8, 7,12,22,18 }
        .Take(n)
        .ToArray();
}

Или вы можете использовать итераторы, которые дают вам значения одно за другим:

private static IEnumerable<int> GetValues()
{
    yield return 3;  //arr[0]
    yield return 12; //arr[1]
    yield return 4;  //arr[2]
    yield return 8;  //arr[3] 
                     //(a=4 Stop!  and return arr)
    yield return 7;
    yield return 12;
    yield return 22;
    yield return 18;
}

public static int[] ArrayPlay(int n)
{
    return GetValues()
        .Take(n)
        .ToArray();
}
person abto    schedule 18.03.2016

Я бы сделал что-то вроде этого:

// your source array
int[] source = new int[]{3,12,4,8,7,12,22,18}; 
int n = 4; // or what ever  N you want
int[] arr = source.TakeWhile(x => x!=n),ToArray(); // with x!=n as your condition to keep taking

Надеюсь это поможет

person marco wassmer    schedule 18.03.2016
comment
Спасибо, я не нашел метод TakeWhile или Take в библиотеке классов msdn Array, я думаю, это какие-то методы интерфейса? не могли бы вы объяснить (x =› x !n) больше для меня? это линк? - person Matilda; 18.03.2016
comment
Да, это лямбда-оператор, анонимная функция. Синтаксис (input parameters) => expression, в TakeWhile x — это элемент, поэтому этот метод проходит через массив, проверяя каждый элемент с помощью лямбда-выражения, пока один из них не вернет true - person marco wassmer; 18.03.2016
comment
приведенный выше код не работал, но аналогичный код: public static int[] ArrayPlay(int n) { return new []{ 3, 12,4, 8, 7,12,22,18} .Take(n) .ToArray( ); } работает, почему так? - person Matilda; 18.03.2016
comment
Да, мой плохой. Это toArray(), take(n) возвращает iEnumrable, а не массив - person marco wassmer; 18.03.2016
comment
Да, я добавил ToArray(), но я не понимаю, почему он выбирает только два первых элемента 3, 12, если я даю аргумент n = 4 - person Matilda; 18.03.2016