2011-12-30 68 views
1

我在写一个过滤很多值的类。 搜索/删除/替换另一个字符串中的字符串的最佳方式是什么?寻找最佳的方式来搜索和替换另一个字符串中的字符串

例如:

name +value (email)

电子邮件,如何把它用? Linq?.Split()?正则表达式?

谁的表现最好?

目前我使用的是这样的:

string[] parts = val.Split('('); 

string Email = parts[1].Replace(")", String.Empty); 

任何帮助表示赞赏。提前致谢。

+2

是多么糟糕的表现呢?我问,因为你想要最好的表现,但没有提供任何指标来解决问题。 – 2011-12-30 16:17:26

+0

性能之间的差异通常是微不足道的,以至于只有在以下情况下才会注意到它们:运行大型处理循环 - 或 - 运行视频游戏。如果没有这些,你不应该解决“哪种性能更好”,除非你真的通过使用产品来确定性能是一个问题。 – Dracorat 2011-12-30 16:26:44

回答

2

顶在我的机器,AV你的代码是最快的(你的代码在第二位)。

注意单位!蜱是100纳秒增量。

 
SplitReplace takes 0.961795 ticks per call 
Split takes 0.747009 ticks per call  
Regex takes 2.512739 ticks per call 
WithLinq takes 2.59299 ticks per call 

我的变化仅仅是只分(不更换):

string[] parts = val.Split('(', ')'); 
return parts[1]; 

测试代码...

[Test] 
public void SO() 
{ 
    const string input = "name +value (email)"; 

    TestGivenMethod(input, SplitReplace, "SplitReplace"); 
    TestGivenMethod(input, JustSplit, "Split"); 
    TestGivenMethod(input, WithRegex, "Regex"); 
    TestGivenMethod(input, WithLinq, "WithLinq"); 
} 

private void TestGivenMethod(string input, Func<string, string> method, string name) 
{ 
    Assert.AreEqual("email", method(input)); 

    var sw = Stopwatch.StartNew(); 
    string res = ""; 

    for (int i = 0; i < 1000000; i++) 
    { 
     var email = method(input); 
     res = email; 
    } 

    sw.Stop(); 

    Assert.AreEqual("email", res); 
    Console.WriteLine("{1} takes {0} ticks per call", sw.ElapsedTicks/1000000.0, name); 
} 

string SplitReplace(string val) 
{ 
    string[] parts = val.Split('('); 
    return parts[1].Replace(")", String.Empty); 
} 

string JustSplit(string val) 
{ 
    string[] parts = val.Split('(', ')'); 
    return parts[1]; 
} 

private static Regex method3Regex = new Regex(@"\(([\[email protected]]+)\)"); 
string WithRegex(string val) 
{ 
    return method3Regex.Match(val).Groups[1].Value; 
} 

string WithLinq(string val) 
{ 
    return new string(val.SkipWhile(c => c != '(').Skip(1).TakeWhile(c => c != ')').ToArray()); 
} 
+0

很好的答案,非常感谢:) – Jack 2012-01-01 22:57:20

0

String.SplitRegular Expression相比将是最简单易懂的方法,我不确定如何在这里适合LINQ。

就性能而言这将是最好的,如果你能做到对分析测试数据,看看正则表达式和String.Split之间的实际性能差异

2

我建议正则表达式,因为我认为这是发明因为这个原因,这是一个字符串和字符串替换搜索。

2

如果我正确理解你的问题,你想从另一个来源

var text = "name +value (email)"; 
var emailAddress = "[email protected]"; 
text = Regex.Replace(text, @"\(email\)", emailAddress); 

的代码块的上方将更换可能提供了电子邮件来代替文字(电子邮件)的“(电子邮件)”与的emailAddress可变

的内容一定要using语句适当添加到您的代码文件

using System.Text.RegularExpressions; 
相关问题