Проблема с методом Insert

148
15 сентября 2017, 18:22

Есть метод, который вставляет пробелы перед прописными буквами. Есть ошибка: в 1 вызове метода пробел ставится только 1 раз, даже если там есть много прописных букв.

BreakCamelCase("вывыВвывывы");
BreakCamelCase("вывыВвывDывы");

Ожидал получить в ответе:

вывы Ввывывы
вывы Ввыв Dывы

Получаю:
вывы Ввывывы
вывыВвыв Dывы

Код:

public static string BreakCamelCase(string str)
{
    string n = null;
    for(int i = 0; i < str.Length;i++)
    {
        if (Char.IsUpper(str[i]))
        {
            n = str.Insert(i, ' '.ToString());
        }
    }
    return n;
}
Answer 1

Это происходит потому что на каждой итерации при срабатывании условия if (Char.IsUpper(str[i])) вы присваиваете переменной n изначальное значение переменной str, вставив в нужной позиции пробел. Тем самым вы просто затираете предыдущие изменения переменной n. Для решения проблемы вам нужно писать строку посимвольно, а не перезаписывать её заново при каждом срабатывании условия (в ответе ниже указан способ, не буду дублировать код). И да, при посимвольной работе со строками в цикле крайне желательно вместо string использовать StringBuilder - в силу неизменяемости строк на каждой итерации вашего цикла будет выделяться новая и притом всё бОльшая память под результирующую строку. StringBuilder же в свою очередь позволяет дописывать данные без создания строки заново

Answer 2

Вы забываете что строки иммутабельны (неизменяемы).

Я бы переписал ваш код так:

public static string BreakCamelCase(string str)
{
    string n = "";
    for (int i = 0; i < str.Length; i++)
    {
        if (Char.IsUpper(str[i])) n += ' ';
        n += str[i];
    }
    return n;
}

Ну и в перспективе переход к StringBuilder

READ ALSO
Ошибка во время первой отправки почты C#

Ошибка во время первой отправки почты C#

На сервере крутится служба, которая согласно определенных событий отправляет почтуСтолкнулся со следующей ошибкой:

177
c# Как перейти в другой класс

c# Как перейти в другой класс

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

219
Префикс перед string: &#39;$&#39;

Префикс перед string: '$'

Прошерстил весь свой справочник по C# и не смог найти что такое '$'

203
Массив в C#, код вместо индекса

Массив в C#, код вместо индекса

В php есть нечто такое:

208