Проверьте, является ли позиция элемента в массиве четной или нечетной (C #) - PullRequest
0 голосов
/ 27 сентября 2018

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

Я объясню лучше: если у меня есть такой массив [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 и arrayOddPosition 7,4,3,1,7,9

Ответы [ 3 ]

0 голосов
/ 27 сентября 2018

Я думаю, что для вашей задачи базовая форма цикла 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];
  }
}

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

0 голосов
/ 27 сентября 2018

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

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();
    }
}
0 голосов
/ 27 сентября 2018

Попробуйте 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...