LINQ查询string.replace

Kum*_*mar 4 .net c# linq

在给定任何字符串的地方寻找帮助,返回仅包含字母数字字符的字符串,并用_替换所有非字母数字字符

字符串"ASD @#$ 123"变为"ASD___123"

等等

谢谢

Dou*_*las 10

对于大多数字符串操作,如果使用正则表达式而不是LINQ ,最好(在效率和简洁性方面):

string input = "ASD@#$123";
string result = Regex.Replace(input, "[^A-Z0-9]", "_", RegexOptions.IgnoreCase);
Run Code Online (Sandbox Code Playgroud)

如果要保留任何Unicode字母数字字符,包括非ASCII字母é,我们可以使用非单词字符类使其更简单:

string input = "ASD@#$123";
string result = Regex.Replace(input, @"\W", "_");
Run Code Online (Sandbox Code Playgroud)

为了便于比较,这里使用LINQ进行相同的转换(仅允许ASCII字母和数字):

string input = "ASD@#$123";
string result =
    new string(input.Select(c => 
        c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z' || c >= '0' && c <= '9' ? c : '_'
    ).ToArray());
Run Code Online (Sandbox Code Playgroud)

或者,如果Char.IsLetterOrDigit符合您的要求:

string input = "ASD@#$123";
string result = 
    new string(input.Select(c => char.IsLetterOrDigit(c) ? c : '_').ToArray());
Run Code Online (Sandbox Code Playgroud)

请注意,Char.IsLetterOrDigit将允许非ASCII字母,并且与\w我们的第二个示例中使用否定的字符类相当.

编辑:正如Steve Wortham所观察到的,LINQ版本实际上比正则表达式快3倍(即使Regex事先创建RegexOptions.Compiled并重新使用了实例).

  • +1.虽然我必须注意,即使您的第一个Regex解决方案简洁,但它比Linq解决方案慢3倍.它有点帮助启用RegexOptions.Compiled,但Linq仍然很容易赢得比赛. (3认同)