Re[3]: У string нет ReplaceAt(int, char)
От: Jack128  
Дата: 08.07.25 16:50
Оценка: 8 (1) +1
Здравствуйте, 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;
    }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.