Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何一次执行多个替换调用_C#_String - Fatal编程技术网

C# 如何一次执行多个替换调用

C# 如何一次执行多个替换调用,c#,string,C#,String,我手头有个奇怪的问题。我有一个文本,它的编码方式是每个字符都被另一个字符替换,我正在创建一个应用程序,用正确的字符替换每个字符。但我遇到了一个我很难解决的问题。让我举个例子来说明: Original text: This is a line. Encoded text: (.T#*T#*%*=T50; 现在,正如我所说,每个字符代表另一个字符,“(‘是’T’,‘.’实际上是‘h’等等 现在我可以跟你一起去了 string decoded = encoded.Replace('(','T');

我手头有个奇怪的问题。我有一个文本,它的编码方式是每个字符都被另一个字符替换,我正在创建一个应用程序,用正确的字符替换每个字符。但我遇到了一个我很难解决的问题。让我举个例子来说明:

Original text: This is a line.
Encoded text:  (.T#*T#*%*=T50;
现在,正如我所说,每个字符代表另一个字符,“(‘是’T’,‘.’实际上是‘h’等等

现在我可以跟你一起去了

string decoded = encoded.Replace('(','T'); //T.T#*T#*%*=T50;
这将解决一个问题,但当我到达字符“T”时,它实际上是编码字符“I”,我将不得不用“I”替换所有的“T”,这意味着所有以前解码的字母“T”(曾经是“(”)也将随着编码的“T”而改变

//T.T#*T#*%*=T50; -> i.i#*i#*%*=i50;
在这种情况下,很明显我应该换一种方式,先把“T”改为“I”,然后再把“T”(“T”)改为“T”,但在文本中,我改变了这种分析方式

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


谢谢!

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

相反,您可以为每个编码字符创建一个方法,该方法将输出一个解码字符,然后通过
char
数组遍历字符串,并对该数组中的每个字符使用“解密”方法获取解码字符-这样您将收到解码字符串

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


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

相反,您可以为每个编码字符创建一个方法,该方法将输出一个解码字符,然后通过
char
数组遍历字符串,并对该数组中的每个字符使用“解密”方法获取解码字符-这样您将收到解码字符串

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

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

相反,在字符串上循环一次并逐个替换字符

创建一个函数,该函数接受
字符
,并返回替换的
字符
。为简单起见,我只显示签名:

private char Decode(char c);
然后只需在字符串上循环,并对每个字符调用该函数。LINQ可以很短地完成以下工作:

var decodedString = new string(encodedString.Select(c => Decode(c)).ToArray());
(这是徒手编写的,未经测试,您可能需要也可能不需要
.ToArray()
字符串
构造函数高兴,我不确定。但您明白了。)

如果更容易阅读,您也可以手动循环字符串,并可能对每个连续的
字符使用
StringBuilder
,以生成最终解码结果。

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

相反,在字符串上循环一次并逐个替换字符

创建一个函数,该函数接受
字符
,并返回替换的
字符
。为简单起见,我只显示签名:

private char Decode(char c);
然后只需在字符串上循环,并对每个字符调用该函数。LINQ可以很短地完成以下工作:

var decodedString = new string(encodedString.Select(c => Decode(c)).ToArray());
(这是徒手编写的,未经测试,您可能需要也可能不需要
.ToArray()
字符串
构造函数高兴,我不确定。但您明白了。)


如果更容易阅读,您也可以手动循环字符串,并可能对每个连续的
char
使用
StringBuilder
来构建最终解码结果。

在不了解加密算法的情况下,此答案假设它是一个类似于

传入加密字符串后,该方法在每个字符上循环,通过
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();
}
私有字符串解密(字符串输入)
{
常数int shiftDelta=10;
var inputChars=input.tocharray();
var outputChars=新字符[inputChars.Length];
对于(变量i=0;i
在不了解加密算法的情况下,此答案假设它是一个简单的字符翻译,类似于

传入加密字符串后,该方法在每个字符上循环,通过
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();
}
私有字符串解密(字符串输入)
{
常数int shiftDelta=10;
var inputChars=input.tocharray();
var outputChars=新字符[inputChars.Length];
对于(变量i=0;i
使用百万嵌套的
字符串。Replace
语句效率极低。请您扩展加密算法?如果它只是根据某个函数修改ASCII值,那么您最好将字符串作为字符数组枚举。您甚至可以使用正则表达式
。Replace
来完成此操作。使用一百万嵌套的
字符串跟随此链接。Replace
语句的效率将非常低。请详细介绍加密算法。如果只是根据某个函数修改ASCII值,则最好将字符串作为字符数组枚举。您甚至可以使用re正则表达式
。替换
以完成此操作。使用
swit跟随此链接