在C#中replace多个string元素

有没有更好的方法来做到这一点…

MyString.Trim().Replace("&", "and").Replace(",", "").Replace(" ", " ") .Replace(" ", "-").Replace("'", "").Replace("/", "").ToLower(); 

我已经扩展了string类,以保持它的一个工作,但有一个更快的方法?

 public static class StringExtension { public static string clean(this string s) { return s.Replace("&", "and").Replace(",", "").Replace(" ", " ") .Replace(" ", "-").Replace("'", "").Replace(".", "") .Replace("eacute;", "é").ToLower(); } } 

只是为了好玩(并且停止评论中的论据),我已经把基准推到了下面的各个例子上。

https://gist.github.com/ChrisMcKee/5937656

正则expression式得分非常可怕; 字典选项出现最快; stringbuilderreplace的冗长版本比短手略快。

更快 – 没有。 更有效 – 是的,如果你将使用StringBuilder类。 随着您的实施,每个操作都会生成一个string的副本,在某些情况下可能会影响性能 string是不可变的对象,所以每个操作只是返回一个修改后的副本。

如果你期望这个方法被主动调用多个长度相当的Strings ,那么把它的实现“迁移”到StringBuilder类可能会更好。 有了它,直接在该实例上进行任何修改,因此您可以省去不必要的复制操作。

 public static class StringExtention { public static string clean(this string s) { StringBuilder sb = new StringBuilder (s); sb.Replace("&", "and"); sb.Replace(",", ""); sb.Replace(" ", " "); sb.Replace(" ", "-"); sb.Replace("'", ""); sb.Replace(".", ""); sb.Replace("eacute;", "é"); return sb.ToString().ToLower(); } } 

也许更可读?

  public static class StringExtension { private static Dictionary<string, string> _replacements = new Dictionary<string, string>(); static StringExtension() { _replacements["&"] = "and"; _replacements[","] = ""; _replacements[" "] = " "; // etc... } public static string clean(this string s) { foreach (string to_replace in _replacements.Keys) { s = s.Replace(to_replace, _replacements[to_replace]); } return s; } } 

另外添加新城镇有关StringBuilder的build议…

这将会更有效率:

 public static class StringExtension { public static string clean(this string s) { return new StringBuilder(s) .Replace("&", "and") .Replace(",", "") .Replace(" ", " ") .Replace(" ", "-") .Replace("'", "") .Replace(".", "") .Replace("eacute;", "é") .ToString() .ToLower(); } } 

如果你只是在一个漂亮的解决scheme后,并不需要节省几个纳秒,那么一些LINQ糖呢?

 var input = "test1test2test3"; var replacements = new Dictionary<string, string> { { "1", "*" }, { "2", "_" }, { "3", "&" } }; var output = replacements.Aggregate(input, (current, replacement) => current.Replace(replacement.Key, replacement.Value)); 

在build议的解决scheme中有一件事情可能会被优化。 有很多调用Replace()使得代码在同一个string上进行多次传递。 由于CPU高速caching容量丢失,使用很长的string时,解决scheme可能会变慢。 可能是一个应该考虑在一个通过replace多个string 。

我正在做类似的事情,但在我的情况下,我正在做序列化/反序列化,所以我需要能够去两个方向。 我发现使用一个string[] []与字典几乎完全一样,包括初始化,但是你也可以转向另一个方向,将replace字符返回到它们的原始值,这是字典确实没有设置的。

编辑:您可以使用Dictionary<Key,List<Values>>来获得与string [] []相同的结果

另一个select使用LINQ是

 [TestMethod] public void Test() { var input = "it's worth a lot of money, if you can find a buyer."; var expected = "its worth a lot of money if you can find a buyer"; var removeList = new string[] { ".", ",", "'" }; var result = input; removeList.ToList().ForEach(o => result = result.Replace(o, string.Empty)); Assert.AreEqual(expected, result); } 
 string input = "it's worth a lot of money, if you can find a buyer."; for (dynamic i = 0, repl = new string[,] { { "'", "''" }, { "money", "$" }, { "find", "locate" } }; i < repl.Length / 2; i++) { input = input.Replace(repl[i, 0], repl[i, 1]); }