/// <summary>
 /// Определяет, есть ли у каждого блока своя пара.
 /// </summary>
 /// <param name="blockArray">Массив блоков.</param>
 /// <returns>Истина, если у каждого блока есть пара.</returns>
 private bool AllPairsIsFound(Block[] blockArray)
 {
     for (int i = 0; i < blockArray.Length; i++)
     {
         if (blockArray[blockArray[i].PairBlockId].PairBlockId != i)
         {
             return false;
         }
     }
     return true;
 }
        /// <summary>
        /// Формирует массив попарносвязанных блоков.
        /// </summary>
        /// <param name="blockNumber">Количество блоков.</param>
        /// <returns>Массив парных блоков.</returns>
        public Block[] BuildPairBlocks(int blockNumber)
        {
            if (blockNumber % 2 != 0)
            {
                throw new InvalidOperationException("Количество блоков должно быть четным!");
            }

            var pull = new IndexPull(blockNumber);
            var blocks = new Block[blockNumber];
            var marks = new bool[blockNumber];
            for (int i = blocks.Length - 1; i >= 0; i--)
            {
                blocks[i].Id = i;
                pull.RemoveIndex(i);
                if (marks[i] == false)
                {
                    int pairId = pull.PopIndex();
                    blocks[i].PairBlockId = pairId;
                    blocks[pairId].PairBlockId = i;
                    marks[pairId] = true;
                }
                Settings.CongruenceArray[i] = blocks[i].PairBlockId;
            }
            return blocks;
        }