Проверьте, является ли позиция элемента в массиве четной или нечетной (C#)

Что я хочу сделать, это, учитывая массив, выбрать элементы, которые имеют четный / нечетный индекс в списке.

Я объясню лучше: если у меня есть такой массив [1,4,6,2,8]Хочу добавить в список (evenList) все предметы, которые имеют even position (позиция ноль, два, четыре и т. д.) в массиве (в данном случае 1,6,8). То же самое для странных предметов.

Я разработал следующий код, но я застрял.

class CheckItem
{
    static readonly string myNumber = "5784230137691";

    static int[] firstTwelveList = new int[12];
    static int[] arrayEvenPosition = new int[(myNumber.Length / 2)];
    static int[] arrayOddPosition = new int[(myNumber.Length / 2)];

    static readonly int idx = 0;

    public static void Position()
    {
        firstTwelveList = myNumber.Substring(0, 12).Select(c => c - '0').ToArray();

        foreach (var even in firstTwelveList)
        {
            if(Array.IndexOf(firstTwelveList, idx) % 2 == 0) //never enter here...
            {
                Array.Copy(firstTwelveList, arrayEvenPosition, (myNumber.Length / 2));
            }
        }
        Console.ReadLine();
    }
}

Я ожидаю, что arrayEvenPosition будет содержать 5,8,2,0,3,6,1 а также arrayOddPosition7,4,3,1,7,9

3 ответа

Попробуйте Linq:

 firstTwelveList = myNumber
   .Take(12)
   .Select(c => c - '0')
   .ToArray();

 arrayEvenPosition = firstTwelveList
   .Where((item, index) => index % 2 == 0)
   .ToArray();

 arrayOddPosition = firstTwelveList
   .Where((item, index) => index % 2 != 0)
   .ToArray();

Я думаю, что для вашей задачи базовая форма for петля лучше тогда foreach,

int j=0;
int k=0;
for (int i=0; i<firstTwelveList.Length; i++) {
  if (i % 2 == 0) {
     arrayEvenPosition[j++] = firstTwelveList[i];
  } else {
     arrayOddPosition[k++] = firstTwelveList[i];
  }
}

Обратите внимание, что мой код - это не полное решение, а лишь идея того, что вы должны делать. Удачи!

Другие ответы верны, что есть более простые способы разбить массив на два массива на основе индекса (нечетный / четный) . Однако я заметил, что с вашим кодом есть две проблемы.

if(Array.IndexOf(firstTwelveList, idx) % 2 == 0) //never enter here..

два параметра для IndexOf - это массив и элемент, для которого вы хотите найти индекс элемента, idx не является правильным параметром. это должно быть even переменная из цикла foreach

Во-вторых, при копировании правильного значения в другой массив, вы копируете в новый массив первые 6 символов 1-го массива.

Цитируя справочные документы Array.Copy (Array, Array, Int32), он просто копирует необходимый диапазон элементов из первого массива во второй массив.

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

Весь класс может быть изменен таким образом

class CheckItem
{
    static readonly string myNumber = "5784230137691";

    static int[] firstTwelveList = new int[12];
    static int[] arrayEvenPosition = new int[(myNumber.Length / 2)];
    static int[] arrayOddPosition = new int[(myNumber.Length / 2)];

    static int idx = 0;
    static int evenIdx = 0; // track current index of new array

    public static void Position()
    {
        firstTwelveList = myNumber.Substring(0, 12).Select(c => c - '0').ToArray();

        foreach (var even in firstTwelveList)
        {
            if (Array.IndexOf(firstTwelveList, even) % 2 == 0) // replace idx with even...
            {
                Array.Copy(firstTwelveList, idx, arrayEvenPosition, evenIdx, 1); // copy the element from the current index of first array to new array
                evenIdx++;
            }
            idx++;
        }
        Console.ReadLine();
    }
}
Другие вопросы по тегам