C# 替换字符串中的字符列表,不要覆盖替换的字符

C# 替换字符串中的字符列表,不要覆盖替换的字符,c#,encryption,replace,C#,Encryption,Replace,我的一个爱好是:地理缓存,我正在做这个解密程序 想法 我有一个基本的字符列表: [a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,0,1,2,3,4,5,6,7,8,9] 在windows窗体中,您可以指定每个字符应替换为哪个字符 [A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,9,8,7,6,5,4,3,2,1,0] 所以这会导致我要解密的字符串被转换成大写 示例:快速棕色狐狸

我的一个爱好是:地理缓存,我正在做这个解密程序

想法 我有一个基本的字符列表:

[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,0,1,2,3,4,5,6,7,8,9]
在windows窗体中,您可以指定每个字符应替换为哪个字符

[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,9,8,7,6,5,4,3,2,1,0]
所以这会导致我要解密的字符串被转换成大写

示例:
快速棕色狐狸跳过懒狗
将导致
快速棕色狐狸跳过懒狗

我是怎么解决的 现在我使用了一个更现实的值来替换:

[a,b,c,d,t,f,g,h,i,j,k,l,m,n,o,p,q,r,s,p,u,v,w,x,y,z,0,1,2,3,4,5,6,7,8,9]
注意,我用t改变了e,用p改变了t

结果:
quick brown fox跳过了懒狗
变成了
php quick brown fox跳过了ovpr php懒狗

正如您在
中看到的,它将
替换为
tht
,然后替换为
php
。从我的逻辑来看,这是显而易见的

我怎样才能防止这种情况?因此,这将显示
pht
,并且不会两次替换字符


我希望我已经解释清楚了。

为什么不一个字符一个字符地构建解码的字符串,而不是修改源代码的副本

首先,构建一个字典,将每个编码字符与其解码值进行匹配

public static string DecodeWithKey(string source, Dictionary<char,char> decoder) 
{ 
    StringBuilder sb = new StringBuilder(source.Length); 
    for (int i = 0; i < source.Length; i++) 
    { 
        sb.Append( decoder[source[i]] ); // error management left out as an exercice
    } 
    return sb.ToString(); 
}
publicstaticstringdecodewithkey(字符串源,字典解码器)
{ 
StringBuilder sb=新的StringBuilder(source.Length);
for(int i=0;i
作为对Piotr评论的回应,让我们尝试在游戏中加入一些LINQ:

public static string DecodeWithKey(string source, Dictionary<char,char> decoder) 
{ 
    return String.Concat(from ch in source select decoder[ch]);
}
publicstaticstringdecodewithkey(字符串源,字典解码器)
{ 
返回String.Concat(来自源选择解码器[ch]中的ch);
}

为什么不一个字符一个字符地构建解码后的字符串,而不是就地修改源代码的副本

首先,构建一个字典,将每个编码字符与其解码值进行匹配

public static string DecodeWithKey(string source, Dictionary<char,char> decoder) 
{ 
    StringBuilder sb = new StringBuilder(source.Length); 
    for (int i = 0; i < source.Length; i++) 
    { 
        sb.Append( decoder[source[i]] ); // error management left out as an exercice
    } 
    return sb.ToString(); 
}
publicstaticstringdecodewithkey(字符串源,字典解码器)
{ 
StringBuilder sb=新的StringBuilder(source.Length);
for(int i=0;i
作为对Piotr评论的回应,让我们尝试在游戏中加入一些LINQ:

public static string DecodeWithKey(string source, Dictionary<char,char> decoder) 
{ 
    return String.Concat(from ch in source select decoder[ch]);
}
publicstaticstringdecodewithkey(字符串源,字典解码器)
{ 
返回String.Concat(来自源选择解码器[ch]中的ch);
}

您可以使用regex replace执行您想要的操作。看一看

将替换内容转换为词典,然后:

var regex = new Regex(String.Join("|",map.Keys));
var newStr = regex.Replace(str, m => map[m.Value]);

您可以使用regex replace执行您想要的操作。看一看

将替换内容转换为词典,然后:

var regex = new Regex(String.Join("|",map.Keys));
var newStr = regex.Replace(str, m => map[m.Value]);

p在第二个示例中存在两次-如果这是正确的,则意味着无法恢复原始文本。@Daniel感谢角度。不过,这只是为了解密一个字符串,所以它并不重要。正如我所说,加密后就不可能解密。p在第二个示例中存在两次-如果这是正确的,则意味着无法还原原始文本。@Daniel感谢您的角度。不过,这只是为了解密一个字符串,所以它不重要。正如我所说,加密后就不可能解密。我觉得有点愚蠢:-)你是对的,这太简单了。我现在应该去喝咖啡了……Loop可以换成LINQI了,我真的很惊讶看到像你这样有名气的人提出这样的问题。别担心,我们都有不好的日子;-)我觉得有点傻:-)你说得对,真是太好了。我现在应该去喝咖啡了……Loop可以换成LINQI了,我真的很惊讶看到像你这样有名气的人提出这样的问题。别担心,我们都有不好的日子;-)