C# 使用Regex.Replace替换为LinQ

C# 使用Regex.Replace替换为LinQ,c#,regex,linq,C#,Regex,Linq,我有一个将unicode字符串转换为非unicode字符串的小插件。它看起来像: public static class StringHelper { public static string ToNonUnicode(this string source) { if (!string.IsNullOrEmpty(source)) { source = source.Trim().Replace(".", "");

我有一个将unicode字符串转换为非unicode字符串的小插件。它看起来像:

public static class StringHelper
{
    public static string ToNonUnicode(this string source)
    {
        if (!string.IsNullOrEmpty(source))
        {
            source = source.Trim().Replace(".", "");

            #region rule
            IDictionary<string, string> dict = new Dictionary<string, string>
            {
                { @"\-|\,", "" },
                { @"\s{2}", " " },

                { "à|á|ả|ã|ạ|ă|â|ấ|ầ|ẩ|ẫ|ậ|ằ|ẳ|ắ|ẵ|ặ", "a" },
                { "á|à|ả|ã|ạ|â|ă|ấ|ầ|ẩ|ẫ|ậ|ắ|ằ|ẳ|ẵ|ặ", "a" },

                { "À|Á|Ả|Ã|Ạ|Ă|Â|Ầ|Ấ|Ẩ|Ẫ|Ậ|Ằ|Ắ|Ẳ|Ẵ|Ặ", "A" },
                { "Á|À|Ả|Ã|Ạ|Â|Ă|Ấ|Ầ|Ẩ|Ẫ|Ậ|Ắ|Ằ|Ẳ|Ẵ|Ặ", "A" },

                { "ò|ó|ỏ|õ|ọ|ô|ơ|ồ|ố|ổ|ỗ|ộ|ờ|ớ|ở|ỡ|ợ", "o" },
                { "ó|ò|ỏ|õ|ọ|ô|ơ|ố|ồ|ổ|ỗ|ộ|ớ|ờ|ở|ỡ|ợ", "o" },

                { "Ò|Ó|Ỏ|Õ|Ọ|Ô|Ơ|Ồ|Ố|Ổ|Ỗ|Ộ|Ờ|Ớ|Ở|Ỡ|Ợ", "O" },
                { "Ó|Ò|Ỏ|Õ|Ọ|Ô|Ơ|Ố|Ồ|Ổ|Ỗ|Ộ|Ớ|Ờ|Ở|Ỡ|Ợ", "O" },

                { "è|é|ẻ|ẽ|ẹ|ê|ề|ế|ể|ễ|ệ", "e" },
                { "é|è|ẻ|ẽ|ẹ|ê|ế|ề|ể|ễ|ệ", "e" },

                { "È|É|Ẻ|Ẽ|Ẹ|Ê|Ề|Ế|Ể|Ễ|Ệ", "E" },
                { "É|È|Ẻ|Ẽ|Ẹ|Ê|Ế|Ề|Ể|Ễ|Ệ", "E" },

                { "ù|ú|ủ|ũ|ụ|ư|ừ|ứ|ử|ữ|ự", "u" },
                { "ú|ù|ủ|ũ|ụ|ư|ứ|ừ|ử|ữ|ự", "u" },

                { "Ù|Ú|Ủ|Ũ|Ụ|Ư|Ừ|Ứ|Ử|Ữ|Ự", "U" },
                { "Ú|Ù|Ủ|Ũ|Ụ|Ư|Ứ|Ừ|Ử|Ữ|Ự", "U" },

                { "ì|í|ỉ|ĩ|ị|í|ì|ỉ|ĩ|ị", "i" },
                { "Ì|Í|Ỉ|Ĩ|Ị|Í|Ì|Ỉ|Ĩ|Ị", "I" },

                { "ỳ|ý|ỷ|ỹ|ỵ|ý|ỳ|ỷ|ỹ|ỵ", "y" },
                { "Ỳ|Ý|Ỷ|Ỹ|Ỵ|Ý|Ỳ|Ỷ|Ỹ|Ỵ", "Y" },

                { "đ", "d" }, { "Đ", "D" }
            };
            #endregion

            foreach (var d in dict)
            {
                var matches = Regex.Matches(source, d.Key);
                foreach (Match match in matches)
                {
                    source = Regex.Replace(source, match.Value, d.Value);
                }
            }                
        }            
        return source;
    }
}
为了实现这一点,我必须使用循环两次,一次用于匹配,一次用于替换。我正在寻找另一种方法来更快地编写代码。我认为使用LinQ是一种方式,但我不知道我要去哪里


你能给我一些提示吗?谢谢大家!

您不需要
匹配
循环,只需直接使用
Regex.Replace执行即可

foreach (var d in dict)
{
    source = Regex.Replace(source, d.Key, d.Value);
}   

您不需要
匹配
循环,只需直接使用
Regex.Replace执行即可

foreach (var d in dict)
{
    source = Regex.Replace(source, d.Key, d.Value);
}   

foreach(dict中的vard)source=Regex.Replace(source,d.Key,d.Value)
如果没有额外的
Regex.Matches,不会做同样的事情吗?来自MSDN:如果模式在当前实例中不匹配,则该方法返回当前实例不变。@MarcinJuraszek非常感谢!我的坏。如果没有额外的
Regex.Matches,那么
foreach(dict中的vard)source=Regex.Replace(source,d.Key,d.Value)
不会做同样的事情吗?来自MSDN:如果模式在当前实例中不匹配,则该方法返回当前实例不变。@MarcinJuraszek非常感谢!我的不好。请接受这个答案,如果它对你有效,它会帮助其他用户看到这个问题已经解决,它会给我甜甜的代表:)请接受这个答案,如果它对你有效,它会帮助其他用户看到这个问题已经解决,它会给我甜甜的代表:)