2015-02-10 3 views
3

Я пытался упростить следующее, поместив его в петлю ..Loop петля внутри цикла за счет упрощения

int A0 = 0, A1 = 0, A2 = 0; 

for (A0 = 0; A0 < nums.Length; A0++) 
{ 
    for (A1 = 0; A1 < nums.Length; A1++) 
    { 
     for (A2 = 0; A2 < nums.Length; A2++) 
     { 
      string ss = nums[A0] + nums[A1] + nums[A2]; 
      dataGridView1.Rows.Add(new string[] { ss }); 
     } 
    } 
} 

как A0, A1 и A2, мне нужно идти до A75. Я могу получить результат, если я гнезду, как указано выше. Но как я могу положить его на петлю .. ??

Я попытался это одно:

int[] A = new int[3]; 

for (int i = 0; i < A.Length; i++) 
{ 
    for (A[i] = 0; A[i] < nums.Length; A[i]++) 
    { 
     string ss = ""; 
     for (int j = 0; j < A.Length; j++) ss += nums[A[i]]; 
     dataGridView1.Rows.Add(new string[] { ss }); 
    } 
} 

Но он будет работать только как ..

int A0 = 0, A1 = 0, A2 = 0; 
for (A0 = 0; A0 < nums.Length; A0++) 
{ 
    string ss = nums[A0] + nums[A1] + nums[A2]; 
    dataGridView1.Rows.Add(new string[] { ss }); 
} 
for (A1 = 0; A1 < nums.Length; A1++) 
{ 
    string ss = nums[A0] + nums[A1] + nums[A2]; 
    dataGridView1.Rows.Add(new string[] { ss }); 
} 
for (A2 = 0; A2 < nums.Length; A2++) 
{ 
    string ss = nums[A0] + nums[A1] + nums[A2]; 
    dataGridView1.Rows.Add(new string[] { ss }); 
} 
+1

Какова точная проблема, которую вы пытаетесь решить? – Shekhar

+0

вам нужны 2-мерные массивы A [75, nums.Length] – pm100

+0

Попытка взять все возможные комбинации, когда нет. требуемых цифр и используемых номеров передаются как параметры. –

ответ

1

Computing a Cartesian Product with LINQ Смотрите о том, как написать метод, который может вычислить декартово произведение ряда коллекций неизвестно во время компиляции, что является именно той проблемой, которую вы пытаетесь решить.

Вы можете создать коллекцию коллекций динамически, просто с помощью Repeat:

var query = Enumerable.Repeat(nums, 75) 
    .CartesianProduct() 
    .Select(combination => combination.Sum()); 

Конечно, размер такого запроса будет pretty large. Этот подход будет использовать отложенное выполнение, чтобы вы могли вычислять каждый результат по ходу дела, а не вычислять каждый отдельный результат, прежде чем давать вам какие-либо, но если вы на самом деле пытаетесь вычислить значительный процент значений (или всех из них), вы «Я буду ждать ... долгое время.

2

Эквивалентом

public void DoNestedThings() 
{ 
    for(var A0 = 0; A0 < _max; A0 ++) 
    { 
     //... 
     for(var i5 = 0; i5 < _max; i5++) 
     { 
      DoThing(new List<int>{i0, ..., i5}); 
     } 
    } 
} 

Было бы:

private void DoNestedThings(int depth, Stack<int> indexes) 
{ 
    if(depth == 0) 
    { 
     DoThing(indexes); 
     return; 
    } 
    for(var i = 0; i < _max; i++) 
    { 
     indexes.Push(i); 
     DoNestedThings(depth-1, indexes); 
     indexes.Pop(); 
    } 
} 

public void DoNestedThings() 
{ 
    DoNestedThings(5, new Stack<int>()); 
} 

Это заменяет вложенные циклы с одной петлей, а затем использует рекурсию, чтобы ввести в этом цикле несколько раз. Каждый раз, когда вызывается метод DoNestedThings с depth> 0, вы вводите другой цикл.

(обратите внимание на порядок индексов, переданных DoThing будет отменен)

+0

Отличный ... Запишите, пока он не достигнет своей глубины и не вернет результат к первому calll .. – Sayka

Смежные вопросы