Это то, что вы хотите?
"This will be a test".Replace("i", "X").Replace("t", String.Empty)
Вот простая реализация функции CHRTRAN
- она не работает, если строка содержит \0
и довольно грязная. Вы могли бы написать более хороший, используя циклы, но я просто хотел попробовать это, используя LINQ.
public static String ChrTran(String input, String source, String destination)
{
return source.Aggregate(
input,
(current, symbol) => current.Replace(
symbol,
destination.ElementAtOrDefault(source.IndexOf(symbol))),
preResult => preResult.Replace("\0", String.Empty));
}
И вы можете использовать его.
// Returns "ThXs wXll be a es"
String output = ChrTran("This will be a test", "it", "X");
Просто для того, чтобы иметь чистое решение - то же самое без LINQ и работать также для случаев \0
, и оно почти на месте благодаря использованию StringBuilder
, но, конечно, не изменит ввод.
public static String ChrTran(String input, String source, String destination)
{
StringBuilder result = new StringBuilder(input);
Int32 minLength = Math.Min(source.Length, destination.Length);
for (Int32 i = 0; i < minLength; i++)
{
result.Replace(source[i], destination[i]);
}
for (Int32 i = minLength; i < searchPattern.Length; i++)
{
result.Replace(source[i].ToString(), String.Empty);
}
return result.ToString();
}
Обработка нулевых ссылок отсутствует.
Вдохновленный решением tvanfosson, я дал LINQ второй шанс.
public static String ChrTran(String input, String source, String destination)
{
return new String(input.
Where(symbol =>
!source.Contains(symbol) ||
source.IndexOf(symbol) < destination.Length).
Select(symbol =>
source.Contains(symbol)
? destination[source.IndexOf(symbol)]
: symbol).
ToArray());
}