Модификация массива строк C # без рекурсии - PullRequest
0 голосов
/ 12 июня 2019

У меня есть строковый массив со значениями

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, описанный Эриком Липпертом.

Спасибо всем за помощь и руководство в правильном направлении.

1 Ответ

1 голос
/ 13 июня 2019

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

Вот оно:

string streetName = "patrick portland vic";

string[] split = streetName.Split(' ');
string[] chars = { "*", "~" };

IEnumerable<IEnumerable<string>> choices = split.Select(n => chars.Select(c => $"{n}{c}"));

IEnumerable<IEnumerable<string>> result = choices.CartesianProduct();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...