У string нет ReplaceAt(int, char)
От: Barbar1an Украина  
Дата: 28.03.25 12:06
Оценка:
после 20 лет дотнета обнаружил что нет такой тривиальщины
это что за дно такое?
там же не utf8 внутри который плохо индексируется, даже память выделять не нада, но даже с выделением нет ничего
Я изъездил эту страну вдоль и поперек, общался с умнейшими людьми и я могу вам ручаться в том, что обработка данных является лишь причудой, мода на которую продержится не более года. (с) Эксперт, авторитет и профессионал из 1957 г.
Re: У string нет ReplaceAt(int, char)
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 28.03.25 13:17
Оценка: +4
Здравствуйте, Barbar1an, Вы писали:

B>после 20 лет дотнета обнаружил что нет такой тривиальщины

B>это что за дно такое?
B>там же не utf8 внутри который плохо индексируется, даже память выделять не нада, но даже с выделением нет ничего

Неизменяемый String это настолько типично в разных языках, что странно, что удивляетесь. Можно найти десятки ссылок с обоснованием, почему это в среднем лучше, оставлю это вам.

Делайте новый, а если эта операция частая, то массив или StringBuilder.
The God is real, unless declared integer.
Re: У string нет ReplaceAt(int, char)
От: Sharov Россия  
Дата: 28.03.25 13:20
Оценка:
Здравствуйте, Barbar1an, Вы писали:

B>после 20 лет дотнета обнаружил что нет такой тривиальщины

B>это что за дно такое?
B>там же не utf8 внутри который плохо индексируется, даже память выделять не нада, но даже с выделением нет ничего

Значит мало кому нужно. Тем кому нужно обернутся через char[].
Кодом людям нужно помогать!
Re[2]: У string нет ReplaceAt(int, char)
От: pilgrim_ Россия  
Дата: 28.03.25 13:34
Оценка: 97 (4)
Здравствуйте, 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
Re: У string нет ReplaceAt(int, char)
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.03.25 15:15
Оценка:
Здравствуйте, Barbar1an, Вы писали:

B>после 20 лет дотнета обнаружил что нет такой тривиальщины это что за дно такое?


Логично предположить, что раз за 20 лет не создали, значит не надо и ты что-то не правильно понимаешь.

Ну а то, что мир не совершенен известно с времен сотворения мира. Но вот ты этому вдивляешься.

B>там же не utf8 внутри который плохо индексируется, даже память выделять не нада, но даже с выделением нет ничего


Я тебе открою секрет, что utf16 (используемый в строках дотента) тоже не здорово индексируется и в общем случае банальная индексация не работает. И вот это косяк. Лучше бы они сделали utf8, о котором всем известно, что он содержит многобайтовые символы.

Тут дело не в этом. Дело в неизменяемости. Для изменения строк есть класс StringBuilder. А строки нужны для манипулирования ими как законченными, не изменяемыми объектами. Это дает множество преимуществ. Мерять в них отдельные символы крайне не эффективно. Редко когда нужно заменить ровно один символ. А при этом будет порожден новый объект строки.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
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;
    }
Re[4]: У string нет ReplaceAt(int, char)
От: rameel https://github.com/rsdn/CodeJam
Дата: 09.07.25 17:41
Оценка: 121 (2) +1
Здравствуйте, Jack128, Вы писали:

J>Чтоб сделать лямбду static придется ручками описать структуру State (туплы не подходят, нужна именно ref struct)


Это по тому, что Span нельзя делать параметром дженерика, но нас ведь никто не заставляет string source передавать как ReadOnlySpan<char>, можно передать как есть — строку:
static string ReplaceAt(string source, int index, char ch)
{
    return string.Create(source.Length, (source, index, ch), static (Span<char> buffer, (string source, int index, char ch) state) =>
    {
        state.source.CopyTo(buffer);
        buffer[state.index] = state.ch;
    });
}

Пример Sharplab
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Re[2]: У string нет ReplaceAt(int, char)
От: TK Лес кывт.рф
Дата: 15.07.25 15:42
Оценка: +1
Здравствуйте, Sharov, Вы писали:

S>Значит мало кому нужно. Тем кому нужно обернутся через char[].


Ну какой char, что за дикость? Есть "str".AsSpan()
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.