У меня есть строковый массив со значениями
patrick
portland
vic
и я хочу добиться следующего:
для первого прохода я хочу иметь массив с *, добавленным в конец каждой записи:
patrick*
portland*
vic*
для второго прохода, я хочу заменить * на ~:
patrick*
portland*
vic~
patrick*
portland~
vic*
patrick~
portland*
vic*
для третьего прохода, я хочу заменить другой * на ~:
patrick~
portland*
vic~
patrick~
portland~
vic*
patrick*
portland~
vic~
и так далее, пока все * не будут заменены на ~.
Есть ли способ сделать это без рекурсии?
Редактировать 1:
Нужны следующие строки, сгенерированные на основе: patrick portland vic
patrick*portland*vic*
patrick*portland*vic~
patrick*portland~vic*
patrick~portland*vic*
patrick~portland*vic~
patrick~portland~vic*
patrick*portland~vic~
patrick~portland~vic~
Я думал, что будет проще разбить строку на массив и затем продолжить работу.
Редактировать 2:
Удалось решить эту проблему, используя декартово произведение.
string[] stnameSplit = streetName.Split(' ');
string[] chars = { "*", "~" };
var cartesianProduct = from name in stnameSplit
from cha in chars
select new { name, cha };
List<string> vals = cartesianProduct.Select(p => p.name + p.cha).ToList();
List<List<string>> embeddedList = new List<List<string>>();
int ctr = 0;
List<string> l = new List<string>();
foreach (string s in vals)
{
l.Add(s);
if (ctr % 2 == 1)
{
embeddedList.Add(l);
l = new List<string>();
}
ctr++;
}
var result = embeddedList.ToArray().CartesianProduct();
Последняя строка вызывает метод CartesianProduct, описанный Эриком Липпертом.
Спасибо всем за помощь и руководство в правильном направлении.