Как изменить 1 символ в строке? - PullRequest
37 голосов
/ 24 января 2012

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

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

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

str[0] = 'M';

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

Ответы [ 7 ]

43 голосов
/ 24 января 2012

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

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

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

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

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

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

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

36 голосов
/ 24 января 2012

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

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

Таким образом, вы не можете изменить символы строки, потому что в C # строка isn 't динамический и неизменный, и его символы только для чтения.Чтобы убедиться в этом, попробуйте использовать методы строки, например, если вы выполните str.ToLower(), это создаст новую строку, а ваша предыдущая строка не изменится.

18 голосов
/ 24 января 2012

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

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

StringBuilder strB = new StringBuilder(str);

strB[0] = 'M';
8 голосов
/ 24 января 2012

Я сделал метод, чтобы сделать это

    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);
    }
7 голосов
/ 23 января 2015

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

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

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

Тогда манипулируйте своим содержанием так, как вам нужно ...

 array[0] = "M";

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

string str = new string(array);
5 голосов
/ 01 июля 2014

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

/// <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();
}
5 голосов
/ 24 января 2012
str = "M" + str.Substring(1);

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

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

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

...