2016-04-26 3 views
-11

У меня вход пользователи строка в этих форматах:C# Динамическая для цикла

Пример 1: А, В, С | 1,2,3 | a, b, c

Пример 2: A, B | C, D | E | F, G

Я хочу выписать все возможные комбинации, такие, что:

Возможные выходы для примера 1:

A,1,a A,2,a A,3,a 
A,1,b A,2,b A,3,b 
A,1,c A,2,c A,3,c ... and so on 

Возможные выходы для примера 2:

A,C,E,F B,C,E,F 
A,C,E,G B,C,E,G 
A,D,E,F B,D,E,F 
A,D,E,G B,D,E,G ... and so on 

Моя проблема заключается в том, что символ | не является постоянным, поэтому я не могу просто написать фиксированное количество ne sted for-loop, я не могу это сделать.

Эти входные строки на самом деле являются параметрами команды. В конце концов, я не собираюсь просто выводить эти комбинации на консоль. Я хочу отправить команды, которые выглядят так: COMMAND A 1 a, COMMAND A 1 b и т. Д.

Я не ищу код для копирования и вставки кода. Я просто не могу получить алгоритм, стоящий за этой проблемой, с которой я столкнулся.

Я пробовал много разных контуров, но ничего не работал, и я чувствую, что мой подход идет дальше от решения, поэтому мне просто нужно, чтобы кто-то указал мне в правильном направлении, чтобы я понял концепцию и в конце дня мне все еще нужно сделать свой собственный код, чтобы получить то, что я хочу.

+1

Я не вижу здесь петли! Вы что-то пробовали? –

+0

Вы действительно получите строку вроде этого: 'A, B, C | 1,2,3 | a, b, c'? –

+0

Вы можете использовать «split» для разделения на разные массивы, а затем знать, сколько «|» Есть ... – Th0rndike

ответ

0

Это может быть сделано без рекурсии.

var s = "A,B,C|1,2|a|u,v,w"; 
var u = s.Split('|').Select(v => v.Split(',')).ToList(); 

var buffer = new List<string>(); 
buffer.Add("COMMAND "); 
while (u.Count > 0) 
{ 
    var t = from a in buffer 
      from b in u.First() 
      select a + ' ' + b; 

    buffer = t.ToList(); 
    u.RemoveAt(0); 
} 

buffer список будет содержать «рекурсивный внешнее соединение» комбинированные струны впоследствии.

+0

Спасибо! Что-то я не совсем понимаю: если бы я должен был удалить «buffer.Add» («COMMAND») и «из буфера» (и, конечно, не более 'select a'), тогда я бы добавил только первый элемент из 'u' Список в' buffer' List right? Почему, когда я это сделал, я получаю 'u, v, w' в моем списке' buffer'? Здесь отсутствует концепция LinQ. –

+0

'u' - это список массивов строк. 'From b in u.First()' на самом деле представляет собой цикл над элементами первого массива в списке. –

0

Рекурсия может помочь вам здесь. Рассмотрим следующий пример:

Решение X, Y | ... может быть вычислена путем вычисления решение ..., цикл над X, Y и предваряя каждый вариант .... Таким образом, вам сопутствует один цикл и рекурсия.

+0

Не могли бы вы подробнее рассказать? Спасибо .. –

0

Напишите рекурсивную функцию.

Скажите, что у вас есть data[][] для хранения ввода. Есть что-то вроде:

solution[] 
void printall(data[][], int level) { 
    if (level>data.size()) print solution; 
    for (c in data[level]) { 
    solution[level] = c; 
    printall(data, level +1); 
    } 
} 
+0

это правильный способ сделать это – user853710

+0

Нет, это не так. Это даже не правильный фрагмент C#. И рекурсия - всего лишь расточительный путь для реализации итерации над другим массивом 'data'. –

-1
var input = "A,B,C | 1,2,3 | a,b,c".Replace(' ',''); 
var groups = input.split('|'); 
var a = groups[0].split(","); 
var b = groups[1].split(","); 
var c = groups[2].split(","); 

foreach(var x int a) 
    foreach(var y in b) 
     foreach(var z in c) 
     { 
      Console.WriteLine(x+y+z); 
     } 
+0

номер | меняется – j4rey89

+0

Спасибо @ j4rey89. –

+0

ах, извините, не см. Это metioned – user853710

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