Заменить строковые символы заданным символом

#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 или a char[] .