#c# #string
#c# #строка
Вопрос:
У меня есть длинная строка, которая содержит символы и целые числа. Я хотел бы заменить символ в индексе x, y, z … на заданный символ, например: ‘
Пример: Заменить символы на ‘ в индексе: 3,9 и 14
input: c9e49869a1483v4d9b4ab7d394a328d7d8a3
output: c9e'9869a'483v'd9b4ab7d394a328d7d8a3
Я ищу какое-то общее решение на C#
Комментарии:
1. @Steve Исправлено
2. @Rango Да, это строка.
Ответ №1:
Вероятно, самым простым вариантом является использование StringBuilder
, у которого есть индексатор чтения / записи:
using System;
using System.Text;
public class Test
{
public static void Main()
{
string oldText = "c9e49869a1483v4d9b4ab7d394a328d7d8a3";
string newText = ReplaceByIndex(oldText, ''', 3, 9, 14);
Console.WriteLine(newText);
}
static string ReplaceByIndex(string text, char newValue, params int[] indexes)
{
var builder = new StringBuilder(text);
foreach (var index in indexes)
{
builder[index] = newValue;
}
return builder.ToString();
}
}
Конечно, вы могли бы сделать это через массив символов:
static string ReplaceByIndex(string text, char newValue, params int[] indexes)
{
var array = text.ToCharArray();
foreach (var index in indexes)
{
array[index] = newValue;
}
return new string(array);
}
Комментарии:
1. @Johnny: Что бы сделала эта проверка? Предположительно, генерируется исключение, которое произойдет естественным образом в любом случае. (И результирующее исключение будет полностью подходящим IMO.) Конечно, предварительная проверка немного ускорила бы процесс ошибки (избегая копирования текста), но это также замедлило бы процесс успеха (выполняя дополнительную работу). Я бы предпочел, чтобы случай успеха был быстрым — исключения и так будут относительно медленными, поэтому дополнительная операция копирования, вероятно, не имеет большого значения.
Ответ №2:
Вы можете попробовать Linq:
string input = "c9e49869a1483v4d9b4ab7d394a328d7d8a3";
int[] positions = new[] {4, 10, 15};
string output = string.Concat(input.Select((c, i) => positions.Contains(i) ? ''' : c));
Комментарии:
1. Хотя это и сработает, я бы предположил, что это значительно сложнее для понимания и менее эффективно, чем использование
StringBuilder
или achar[]
.