如何执行mutliple立即替换呼叫

时间:2017-01-31 13:35:44

标签: c# string

我手边有一个奇怪的问题。我有一个文本编码的方式,每个字符都被另一个字符替换,我创建一个应用程序,用一个正确的字符替换每个字符。但我遇到了一个我无法解决问题的问题。让我举一个例子:

Original text: This is a line.
Encoded text:  (.T#*T#*%*=T50;

现在,正如我所说,每个角色代表另一个角色,'(' T','。'实际上是' h'等等。

现在我可以选择

string decoded = encoded.Replace('(','T'); //T.T#*T#*%*=T50;

这将解决一个问题,但当我达到角色时,T' T'这实际上是编码字符' i'我将不得不更换所有的' T'与' i',这意味着所有先前解码的字母(曾经'(')也会随着编码的#39而改变) ; T'。

//T.T#*T#*%*=T50; -> i.i#*i#*%*=i50;
在这种情况下,显而易见的是,我应该走另一条路,先改变“T' T'到了'我'然后'('到' T',但在文中我改变那种分析不是一种选择。

我可以做些什么来正确执行任务?

谢谢!

3 个答案:

答案 0 :(得分:2)

一种可能的解决方案是根本不使用替换字符串方法。

相反,您可以创建一个方法,对于每个编码字符输出已解码的一个,然后通过char数组遍历您的字符串,并且对于此数组中的每个字符使用"解密"获取解码字符的方法 - 因此您将接收已解码的字符串。

例如(使用StringBulder创建新字符串):

private static char Decode(char source)
{
        if (source == '(')
            return 'T';
        else if (source == '.')
            return 'h';
        //.... and so on
}

string source = "ABC";

var builder = new StringBuilder();
foreach (var c in source)
    builder.Append(Decode(c));

var result = builder.ToString();

答案 1 :(得分:1)

使用.Replace()可能不是首先要做的事情,因为您每次都会发现它覆盖整个字符串。一旦你修改了整个字符串一次,编码就会丢失。

相反,循环遍历字符串一次并单独替换字符。

创建一个接受char的函数并返回已替换的char。为简单起见,我只会展示签名:

private char Decode(char c);

然后循环遍历字符串并在每个字符上调用该函数。 LINQ可以简单地做到这一点:

var decodedString = new string(encodedString.Select(c => Decode(c)).ToArray());

(这是徒手和未经测试的,您可能需要.ToArray() stringStringBuilder构造函数感到高兴,我不确定。但是您明白了。)< / p>

如果它更容易阅读,您也可以在字符串上手动循环,也可以使用每个连续char的{​​{1}}来构建最终的解码结果。

答案 2 :(得分:0)

在不了解您的加密算法的情况下,此答案假设它是一个类似于Caesar Cipher的简单字符翻译。

传入加密字符串,该方法循环遍历每个字符,并按shiftDelta的值进行调整,并返回结果字符串。

private string Decrypt(string input)
{
    const int shiftDelta = 10;

    var inputChars = input.ToCharArray();
    var outputChars = new char[inputChars.Length];

    for (var i = 0; i < outputChars.Length; i++)
    {
        // Perform character translation here
        outputChars[i] = (char)(inputChars[i] + shiftDelta); 
    }

    return outputChars.ToString();
}