string myString = "ABCDEFGHIJ";
string modifiedString = new StringBuilder(myString){[3]='Z', [4]='X'}.ToString();
Позвольте мне объяснить мое решение.
Учитывая постановку задачи об изменении строки в двух ее конкретных позициях («от позиции 4 до позиции 5») с двумя символами «Z» и «X», и предлагается использовать индекс позиции для изменения строки, а не строки. Replace ( ) (возможно, из-за возможности повторения некоторых символов в реальной строке), я бы предпочел использовать минималистский подход для достижения цели, вместо использования Substring()
и строки Concat()
или строки Remove()
и Insert()
подход. Хотя все эти решения будут служить цели в достижении той же цели, но это зависит только от личного выбора и философии урегулирования с минималистским подходом.
Возвращаясь к вышеупомянутому решению, если мы рассмотрим string
и StringBuilder
, они оба внутренне воспримут данную строку как массив символов. Если мы посмотрим на реализацию StringBuilder
, она поддерживает внутреннюю переменную, например «internal char[] m_ChunkChars;
», для захвата данной строки. Теперь, поскольку это внутренняя переменная, мы не можем напрямую обращаться к ней. Для внешнего мира, чтобы иметь возможность получить доступ и изменить этот массив символов, StringBuilder
предоставляет их через свойство indexer, которое выглядит примерно так:
[IndexerName("Chars")]
public char this[int index]
{
get
{
StringBuilder stringBuilder = this;
do
{
// … some code
return stringBuilder.m_ChunkChars[index1];
// … some more code
}
}
set
{
StringBuilder stringBuilder = this;
do
{
//… some code
stringBuilder.m_ChunkChars[index1] = value;
return;
// …. Some more code
}
}
}
Мое решение, упомянутое выше, использует эту возможность индексатора для непосредственного изменения внутреннего символьного массива, который IMO эффективен и минималистичен.
КСТАТИ; мы можем переписать вышеприведенное решение более детально, как показано ниже:
string myString = "ABCDEFGHIJ";
StringBuilder tempString = new StringBuilder(myString);
tempString[3] = 'Z';
tempString[4] = 'X';
string modifiedString = tempString.ToString();
В этом контексте также хотелось бы отметить, что в случае string
он также имеет свойство indexer как средство для представления своего внутреннего символьного массива, но в этом случае он имеет только свойство Getter (и не Setter), так как строка неизменный в природе. И именно поэтому нам нужно использовать StringBuilder
для изменения массива символов.
[IndexerName("Chars")]
public extern char this[int index] { [SecuritySafeCritical, __DynamicallyInvokable, MethodImpl(MethodImplOptions.InternalCall)] get; }
И, наконец, что не менее важно, это решение лучше всего подходит для этой конкретной проблемы, когда требуется заменить только несколько символов с заранее известным индексом позиции. Это может не подходить лучше всего, когда требуется изменить довольно длинную строку, т. Е. Количество символов для изменения велико.