C# string.replace的LINQ查询

C# string.replace的LINQ查询,c#,.net,linq,C#,.net,Linq,如果给定任何字符串,请查找帮助,返回仅包含字母数字字符的字符串,并将所有非字母数字字符替换为_ 所以串 “ASD#123美元”成为 “ASD_____123” 等 感谢大多数字符串操作,如果您使用正则表达式而不是LINQ,您的情况会更好(在效率和简洁性方面): string input = "ASD@#$123"; string result = Regex.Replace(input, "[^A-Z0-9]", "_", RegexOptions.IgnoreCase); 如果要保留任何Un

如果给定任何字符串,请查找帮助,返回仅包含字母数字字符的字符串,并将所有非字母数字字符替换为_

所以串 “ASD#123美元”成为 “ASD_____123”


感谢大多数字符串操作,如果您使用正则表达式而不是LINQ,您的情况会更好(在效率和简洁性方面):

string input = "ASD@#$123";
string result = Regex.Replace(input, "[^A-Z0-9]", "_", RegexOptions.IgnoreCase);
如果要保留任何Unicode字母数字字符,包括非ASCII字母,如
é
,我们可以使用该类使其更加简单:

string input = "ASD@#$123";
string result = Regex.Replace(input, @"\W", "_");
为了便于比较,以下是使用LINQ进行的相同转换(仅允许ASCII字母和数字):

请注意,
Char.isleterOrdigit
将允许使用非ASCII字母,这与第二个示例中使用否定的
\w
word字符类相当

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


以下是为您提供的功能:

    String ReplaceWrongChars(String baseString)
    {
        Regex rx = new Regex("[^A-Za-z0-9 ]", RegexOptions.CultureInvariant);
        String rv = rx.Replace(baseString, "_");

        return rv;
    }

如果不需要包含空格,请使用“[^A-Za-z0-9]”作为正则表达式。

返回txt.Where(Char.isleterOrdigit).ToArray()收缩字符串,但仍在考虑如何替换它们:)例如,
Ö
α
的可能重复字符是字母数字字符:)@L.B:因为这是一个编校操作,更合理的假设是不允许使用非ASCII字符(尽管我在最后对此做了说明)。@L.B:为了清楚起见,我添加了另一个保留Unicode字母的示例。+1。尽管我必须注意,尽管您的第一个正则表达式解决方案很简洁,但它比您的Linq解决方案慢3倍多。启用RegexOptions有些帮助。编译,但Linq仍然很容易赢得比赛。@SteveWortham:奇怪……让我来测试一下。
string input = "ASD@#$123";
string result = 
    new string(input.Select(c => char.IsLetterOrDigit(c) ? c : '_').ToArray());
char[] unwanted = new[] {'@', '#', '$'};

foreach(var x in query)
{
    x.SomePropertyName = string.Join("_", x.SomePropertyName.Split(unwanted));
};
    String ReplaceWrongChars(String baseString)
    {
        Regex rx = new Regex("[^A-Za-z0-9 ]", RegexOptions.CultureInvariant);
        String rv = rx.Replace(baseString, "_");

        return rv;
    }