Строка не имеет ReplaceAt()
, и я немного ругаюсь о том, как сделать достойную функцию, которая делает то, что мне нужно. Я полагаю, что стоимость процессора высока, но размеры строк небольшие, поэтому все нормально
Замена char на данный индекс в строке?
Ответ 1
Используйте StringBuilder
:
StringBuilder sb = new StringBuilder(theString);
sb[index] = newChar;
theString = sb.ToString();
Ответ 2
Самый простой способ:
public static string ReplaceAt(this string input, int index, char newChar)
{
if (input == null)
{
throw new ArgumentNullException("input");
}
char[] chars = input.ToCharArray();
chars[index] = newChar;
return new string(chars);
}
Теперь это метод расширения, который вы можете использовать:
var foo = "hello".ReplaceAt(2, 'x');
Console.WriteLine(foo); // hexlo
Было бы неплохо подумать о том, что требуется только одна копия данных, а не две, но я не уверен в этом. Возможно, это сделало бы это:
public static string ReplaceAt(this string input, int index, char newChar)
{
if (input == null)
{
throw new ArgumentNullException("input");
}
StringBuilder builder = new StringBuilder(input);
builder[index] = newChar;
return builder.ToString();
}
... Я подозреваю, что это полностью зависит от версии используемой структуры.
Ответ 3
string s = "ihj";
char[] array = s.ToCharArray();
array[1] = 'p';
s = new string(array);
Ответ 4
Мне вдруг понадобилась эта задача и нашла эту тему. Итак, это мой вариант в стиле linq:
public static class Extensions
{
public static string ReplaceAt(this string value, int index, char newchar)
{
if (value.Length <= index)
return value;
else
return string.Concat(value.Select((c, i) => i == index ? newchar : c));
}
}
а затем, например:
string instr = "Replace$dollar";
string outstr = instr.ReplaceAt(7, ' ');
В конце концов мне нужно было использовать .NET Framework 2, поэтому я использую вариант класса StringBuilder
.
Ответ 5
Строки являются неизменяемыми объектами, поэтому вы не можете заменить данный символ в строке. Что вы можете сделать, так это создать новую строку с замененным символом.
Но если вы хотите создать новую строку, почему бы не использовать StringBuilder:
string s = "abc";
StringBuilder sb = new StringBuilder(s);
sb[1] = 'x';
string newS = sb.ToString();
//newS = "axc";
Ответ 6
Если ваш проект (.csproj) позволяет небезопасный код, вероятно, это более быстрое решение:
namespace System
{
public static class StringExt
{
public static unsafe void ReplaceAt(this string source, int index, char value)
{
if (source == null)
throw new ArgumentNullException("source");
if (index < 0 || index >= source.Length)
throw new IndexOutOfRangeException("invalid index value");
fixed (char* ptr = source)
{
ptr[index] = value;
}
}
}
}
Вы можете использовать его как метод расширения объектов String.
Ответ 7
public string ReplaceChar(string sourceString, char newChar, int charIndex)
{
try
{
// if the sourceString exists
if (!String.IsNullOrEmpty(sourceString))
{
// verify the lenght is in range
if (charIndex < sourceString.Length)
{
// Get the oldChar
char oldChar = sourceString[charIndex];
// Replace out the char ***WARNING - THIS CODE IS WRONG - it replaces ALL occurrences of oldChar in string!!!***
sourceString.Replace(oldChar, newChar);
}
}
}
catch (Exception error)
{
// for debugging only
string err = error.ToString();
}
// return value
return sourceString;
}