Здравствуйте, Barbar1an, Вы писали:
B>после 20 лет дотнета обнаружил что нет такой тривиальщины B>это что за дно такое? B>там же не utf8 внутри который плохо индексируется, даже память выделять не нада, но даже с выделением нет ничего
Неизменяемый String это настолько типично в разных языках, что странно, что удивляетесь. Можно найти десятки ссылок с обоснованием, почему это в среднем лучше, оставлю это вам.
Делайте новый, а если эта операция частая, то массив или StringBuilder.
Здравствуйте, Jack128, Вы писали:
J>Чтоб сделать лямбду static придется ручками описать структуру State (туплы не подходят, нужна именно ref struct)
Это по тому, что Span нельзя делать параметром дженерика, но нас ведь никто не заставляет string source передавать как ReadOnlySpan<char>, можно передать как есть — строку:
Здравствуйте, pilgrim_, Вы писали:
_>Здравствуйте, netch80, Вы писали:
N>>Делайте новый, а если эта операция частая, то массив или StringBuilder.
_>С какой-то версии core появился метод string.Create, где можно обойтись одной алокацией и копированием.
_>
Тут две алокации, первая на саму результирующую строку, вторая — на лямбду. Чтоб сделать лямбду 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;
}
после 20 лет дотнета обнаружил что нет такой тривиальщины
это что за дно такое?
там же не utf8 внутри который плохо индексируется, даже память выделять не нада, но даже с выделением нет ничего
Я изъездил эту страну вдоль и поперек, общался с умнейшими людьми и я могу вам ручаться в том, что обработка данных является лишь причудой, мода на которую продержится не более года. (с) Эксперт, авторитет и профессионал из 1957 г.
Здравствуйте, Barbar1an, Вы писали:
B>после 20 лет дотнета обнаружил что нет такой тривиальщины B>это что за дно такое? B>там же не utf8 внутри который плохо индексируется, даже память выделять не нада, но даже с выделением нет ничего
Значит мало кому нужно. Тем кому нужно обернутся через char[].
Здравствуйте, Barbar1an, Вы писали:
B>после 20 лет дотнета обнаружил что нет такой тривиальщины это что за дно такое?
Логично предположить, что раз за 20 лет не создали, значит не надо и ты что-то не правильно понимаешь.
Ну а то, что мир не совершенен известно с времен сотворения мира. Но вот ты этому вдивляешься.
B>там же не utf8 внутри который плохо индексируется, даже память выделять не нада, но даже с выделением нет ничего
Я тебе открою секрет, что utf16 (используемый в строках дотента) тоже не здорово индексируется и в общем случае банальная индексация не работает. И вот это косяк. Лучше бы они сделали utf8, о котором всем известно, что он содержит многобайтовые символы.
Тут дело не в этом. Дело в неизменяемости. Для изменения строк есть класс StringBuilder. А строки нужны для манипулирования ими как законченными, не изменяемыми объектами. Это дает множество преимуществ. Мерять в них отдельные символы крайне не эффективно. Редко когда нужно заменить ровно один символ. А при этом будет порожден новый объект строки.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.