Подтвердить что ты не робот

Как изменить 1 char в строке?

У меня есть этот код:

string str = "valta is the best place in the World";

Мне нужно заменить первый символ. Когда я пробую это:

str[0] = 'M';

Я получил сообщение об ошибке. Как я могу это сделать?

4b9b3361

Ответ 1

Строки неизменяемы, то есть вы не можете изменить персонажа. Вместо этого вы создаете новые строки.

То, что вы просите, может быть сделано несколькими способами. Наиболее подходящее решение будет зависеть от характера изменений, внесенных вами в исходную строку. Вы меняете только одного персонажа? Вам нужно вставить/удалить/добавить?

Вот несколько способов создать новую строку из существующей строки, но с другим первым символом:

str = 'M' + str.Remove(0, 1);

str = 'M' + str.Substring(1);

Выше, новая строка присваивается исходной переменной str.

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

Ответ 2

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

System.Text.StringBuilder strBuilder = new System.Text.StringBuilder("valta is the best place in the World");
strBuilder[0] = 'M';
string str=strBuilder.ToString();

Вы не можете изменить строковые символы таким образом, потому что в С# строка не является динамической и неизменной, а символы - только для чтения. Чтобы убедиться в этом, попробуйте использовать методы строки, например, если вы делаете str.ToLower(), она создает новую строку, а ваша предыдущая строка не изменяется.

Ответ 3

Строки неизменяемы. Вы можете использовать класс построителя строк, чтобы помочь!:

string str = "valta is the best place in the World";

StringBuilder strB = new StringBuilder(str);

strB[0] = 'M';

Ответ 4

Я сделал метод для этого

    string test = "Paul";
    test = ReplaceAtIndex(0, 'M', test);

    (...)

    static string ReplaceAtIndex(int i, char value, string word)
    {
        char[] letters = word.ToCharArray();
        letters[i] = value;
        return string.Join("", letters);
    }

Ответ 5

Хотя он точно не отвечает на вопрос ОП, в зависимости от того, что вы делаете, это может быть хорошим решением. Ниже будет решена моя проблема.

Скажем, что вам нужно много манипулировать различными символами в строке. Вместо использования цепочки все время использует массив char[], пока вы делаете манипуляции. Потому что вы можете это сделать:

 char[] array = "valta is the best place in the World".ToCharArray();

Затем манипулируйте содержимым ваших сердец столько, сколько вам нужно...

 array[0] = "M";

Затем преобразуйте его в строку, как только вы закончите, и вам нужно использовать его как строку:

string str = new string(array);

Ответ 6

str = "M" + str.Substring(1);

Если вы сделаете несколько таких изменений, используйте StringBuilder или char[].

(Порог, когда StringBuilder становится быстрее, - это примерно через 5 конкатенаций или подстрок, но обратите внимание, что сгруппированные конкатенации a + "b" + c + d + "e" + f выполняются в одном вызове, а конкатенации типа компиляции "a" + "b" + "c" не требуют звоните вообще).

Может показаться, что сделать это ужасно неэффективно, но тот факт, что строки не могут быть изменениями, позволяет получить большую прибыль от эффективности и другие преимущества, например, упомянутые в Почему .NET String неизменна?

Ответ 7

Объединенный Чак Норрис отвечает с Пауло Мендонсой с помощью методов расширения:

/// <summary>
/// Replace a string char at index with another char
/// </summary>
/// <param name="text">string to be replaced</param>
/// <param name="index">position of the char to be replaced</param>
/// <param name="c">replacement char</param>
public static string ReplaceAtIndex(this string text, int index, char c)
{
    var stringBuilder = new StringBuilder(text);
    stringBuilder[index] = c;
    return stringBuilder.ToString();
}