Здравствуйте, pilgrim_, Вы писали:
_>Здравствуйте, netch80, Вы писали:
N>>Делайте новый, а если эта операция частая, то массив или StringBuilder.
_>С какой-то версии core появился метод string.Create, где можно обойтись одной алокацией и копированием.
_>_> public static string ReplaceAt(this string source, int index, char replaceChar)
_> {
_> string result = string.Create(source.Length, source.AsSpan(), (Span<char> strContent, ReadOnlySpan<char> srcArray) =>
_> {
_> srcArray.CopyTo(strContent);
_> strContent[index] = replaceChar;
_> });
_> return result;
_> }
_>
_>https://dotnetfiddle.net/JPNBC6
Тут две алокации, первая на саму результирующую строку, вторая — на лямбду. Чтоб сделать лямбду static придется ручками описать структуру State (туплы не подходят, нужна именно ref struct)
ref struct State
{
public ReadOnlySpan<char> src;
public int index;
public char replaceChar;
}
public static string ReplaceAt(this string source, int index, char replaceChar)
{
var state = new State { src = source.AsSpan(), index = index, replaceChar = replaceChar };
string result = string.Create(source.Length, state, static (strContent, state) =>
{
state.src.CopyTo(strContent);
strContent[state.index] = state.replaceChar;
});
return result;
}