Дана задача: Для заданного массива размером n×n, элементы которого являются целыми числами для каждой строки найти последний 
четный элемент и записать данные в новый массив.
Дан кодер: нуб
Написан такой код: он достаточно простой и может длинноват, ибо использовал те знания, которые имеюusing System;
class ProkaznikMassiv
{
    // создаем массив с возможностью задать его размеры
    static void Main()
    {
        Random rand = new Random();
        int n;
        int r;
        int e = 0;
        int w = 0;
        int q = 0;
        bool p = false;
        int s = 0;
        int[] massivResult = new int[2] { 0, 0 };  // создали массив, в который запишем итоговые два числа из массива massiv
                                                   // и заполним сразу обе ячейки, чтобы массив не мог оказаться пустым в конце программы
        Console.WriteLine("Введите число n");
        n = Convert.ToInt32(Console.ReadLine());
        int[,] massiv = new int[n, n];
        Console.WriteLine("\nСоздан массив размерами " + n + "x" + n);
        
        
        for (int i = 0; i <= n-1; i = i + 1)  // заполняем массив данными
        {
            for(int u = 0; u <= n-1; u = u + 1)
            {
                massiv[i, u] = rand.Next(1, 2000);  // записывает в ячейку массива случайное число от 1 до 2000
            }
           
        }
        //  массив создан и заполнен, теперь опрашиваем его и находим последнее чётное
        r = n-1;  // запоминаем количество ячеек в строке массива, но с нуля, чтобы соотв-ло 1й ячейке в строке. 
        foreach (int x in massiv)
        {
            
            if (x%2 == 0)
            {
                p = true;  // true если нашлось чётное число
                w = x;     // присваиваем переменной w это число
            }
             if (e==r && p)
                {        // если строка массива подошла к концу и нашлось чётное число
                    massivResult[q] = w;  // запишем это число в массив massiveResult в ячейку 0
                    q = 1;             // теперь, если число найдется, будем писать в ячейку 1 массива massiveResult
                    r += n;               // отслеживаем конец второй строки массива nxn (massiv который)
                    s++;  // просто проверочная переменная, чтобы подсчитать сколько раз выполнился этот if
                }  // если строка массива подойдет к концу, в massivResult запишется последнее чётное число. Если таковое число не нашлось,
              // то ничего не запишется (значение p будет false) и цикл продолжит искать чётные числа уже во второй строке массива "nxn"
            e++;  // узнаем какая ячейка массива сейчас опрашивается
        }
        // опрос массива кончился. мы проверили все числа и выполнили изначальное задание
        bool v, b;              // проверим, заполнились ли ячейки массива с результатами чем-то или так и остались с "0" т.е. чётное число не было найдено
        
        if (massivResult[0] != 0) v = true;
        else v = false;
        if (massivResult[1] != 0) b = true;
        else b = false;
        // ну вот и всё! осталось вывести результат выполнения программы
        Console.Write("\nНайденые чётные числа в заданом вами массиве оказались: ");
        if (v) Console.Write(massivResult[0] + " ");
        else Console.Write("числа не найдено ");
        Console.Write("в конце первой строки массива, и ");
        if (b) Console.Write(massivResult[1] + " ");
        else Console.Write("числа не найдено ");
        Console.Write("в конце второй строки массива\n");
        Console.WriteLine(s);
    }
}
Проблема в этом участке:foreach (int x in massiv)
        {
            
            if (x%2 == 0)
            {
                p = true;  // true если нашлось чётное число
                w = x;     // присваиваем переменной w это число
            }
             if (e==r && p)
                {        // если строка массива подошла к концу и нашлось чётное число
                    massivResult[q] = w;  // запишем это число в массив massiveResult в ячейку 0
                    q = 1;             // теперь, если число найдется, будем писать в ячейку 1 массива massiveResult
                    r += n;               // отслеживаем конец второй строки массива nxn (massiv который)
                    s++;  // просто проверочная переменная, чтобы подсчитать сколько раз выполнился этот if
                }  // если строка массива подойдет к концу, в massivResult запишется последнее чётное число. Если таковое число не нашлось,
              // то ничего не запишется (значение p будет false) и цикл продолжит искать чётные числа уже во второй строке массива "nxn"
            e++;  // узнаем какая ячейка массива сейчас опрашивается
        }
Суть в том, что переменная q должна быть либо 0, либо 1, чтобы заполнить соответствующие поля массива massivResult[q], который состоит всего из 2 ячеек. 
Изначально написано было так: q++;, но вылезала ошибка переполнения массива, то есть оператор if выполнялся лишние разы, а massivResult[2] не существует. Цикл foreach должен был закончиться раньше.
Сейчас написал q=1, чтобы не вылетало и ввёл проверочную переменную "s" внутрь if, чтобы глянуть сколько раз этот if выполнялся.
Так вот суть вопроса: почему if (e==r && p) выполняется много раз? Какое n в начале вводишь, тому и равен получается s в итоге - то есть дофига раз выполняется этот if. Но должен всего 2 раза! когда совпадут оба условия внутри скобки. Блин, он тупо не работает. Я понимаю возможно это для вас нубская реализация задачи, но логика в ней какая-никакая есть и должна исполняться программой, но не хочет. Почему? Хочу понять.