2015-04-18 2 views
0

Я пытаюсь заполнить каждую строку 2-мерного массива 6 случайными числами из списка Enumerable.Range, который содержит 45 чисел. Каждый раз, когда в определенную строку массива вводится 6 номеров, они удаляются из списка. Проблема в том, что каждая строка массива использует тот же список, пока в нем не останется номеров. Как сбросить список для каждой строки?Как заполнить строку 2-мерного массива случайными числами из Enumerable.Range list C#

Это то, что я до сих пор:

static void InitMatrix(int[,] mat) 
{ 

    List<int> numbers = Enumerable.Range(1, 45).ToList(); 
    Random rnd = new Random(); 

    for (int i = 0; i < mat.GetLength(0); i++) 
    { 
     if(mat.GetLength(0)< mat.GetLength(1)) 

     for (int j = 0; j < mat.GetLength(1); j++) 
     { 
      int index = rnd.Next(0, numbers.Count); 
      mat[i, j] = numbers[index]; 
      numbers.RemoveAt(index); 
     } 
    } 
} 
+0

Если вы хотите сбросить список каждый раз, объявить его внутри для цикла. Somethig like 'List numbers = new Список ; ... numbers = Enumerable.Range (1, 45) .ToList();' – Eminem

+0

@Eminem Я думаю, что у вас это есть. Отправьте это как ответ, и я дам вам +1. –

+0

@TimS. Я слишком медленный для этих парней .. :) – Eminem

ответ

1

Переместить объявление списка ниже первого (рядового) цикла. Таким образом, всякий раз, когда цикл переходит к следующей строке списка переинициализируются/обновляется, если вы ...

static void InitMatrix(int[,] mat) 
{ 
    Random rnd = new Random(); 

    for (int i = 0; i < mat.GetLength(0); i++) 
    { 
     List<int> numbers = Enumerable.Range(1, 45).ToList(); 

     if(mat.GetLength(0)< mat.GetLength(1)) 
     { 
      for (int j = 0; j < mat.GetLength(1); j++) 
      { 
       int index = rnd.Next(0, numbers.Count); 
       mat[i, j] = numbers[index]; 
       numbers.RemoveAt(index); 
      } 
     } 
    } 
} 
+0

Здесь присутствует синтаксическая ошибка: «if (mat ...) внутри цикла не имеет скобок или чего-либо под ним. Я знаю его в исходном коде, но он тоже не работает. –

+0

@RonBeyer Это не является синтаксической ошибкой, но это плохое форматирование. Инструкция 'if' здесь применяется к оператору' for'. Т.е. блок 'for' будет выполняться только в том случае, если' mat.GetLength (0)

+0

@TimS. Да, вы правы, думаю, мой мозг подключен, чтобы видеть, что, поскольку код воняет, все, что больше, чем одна строка для меня, принадлежит скобкам. –

1

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

static void InitMatrix(int[,] mat) { 
    Random rnd = new Random(); 

    for (int i = 0; i < mat.GetLength(0); i++) 
    { 
     if(mat.GetLength(0)< mat.GetLength(1)) 
     { 
      List<int> numbers = Enumerable.Range(1, 45).ToList(); 
      for (int j = 0; j < mat.GetLength(1); j++) 
      { 
       int index = rnd.Next(0, numbers.Count); 
       mat[i, j] = numbers[index]; 
       numbers.RemoveAt(index); 
      } 
     } 
    } 
} 

Код не проверен, но он должен работать.