C# 正在寻找搜索和替换其他字符串中的字符串的最佳方法

C# 正在寻找搜索和替换其他字符串中的字符串的最佳方法,c#,.net,string,replace,C#,.net,String,Replace,我正在编写一个过滤很多值的类。在另一个字符串中搜索/删除/替换字符串的最佳方法是什么 例如: name+value(电子邮件) 电子邮件,如何使用它?林克?或.Split()?还是正则表达式 哪一个性能最好 目前我使用的是: string[] parts = val.Split('('); string Email = parts[1].Replace(")", String.Empty); 与正则表达式相比,String.Split将是最简单、最容易理解的方法,我不确定您如何适应这里的LI

我正在编写一个过滤很多值的类。在另一个字符串中搜索/删除/替换字符串的最佳方法是什么

例如:

name+value(电子邮件)

电子邮件,如何使用它?林克?或
.Split()
?还是正则表达式

哪一个性能最好

目前我使用的是:

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

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

正则表达式
相比,
String.Split
将是最简单、最容易理解的方法,我不确定您如何适应这里的LINQ


就性能而言,最好能对测试数据进行评测,以查看正则表达式和字符串之间的实际性能差异。拆分
字符串。与
正则表达式相比,拆分
将是最简单、最容易理解的方法,我不确定您是如何做到的我可以在这里找到林克


就性能而言,最好根据测试数据进行评测,以查看正则表达式和字符串之间的实际性能差异。拆分我建议使用正则表达式,因为我认为它是出于这个原因而发明的,即搜索字符串和替换字符串。

正则表达式,因为我认为它是因为这个原因而发明的,它是在字符串中搜索和字符串替换。

如果我正确理解了你的问题,你是在尝试用一封可能来自其他来源的电子邮件替换(电子邮件)的文字

var text = "name +value (email)";
var emailAddress = "someone@test.com";
text = Regex.Replace(text, @"\(email\)", emailAddress);
上面的代码块将用
emailAddress
变量的内容替换“(电子邮件)”

请确保将适当的using语句添加到代码文件的顶部

using System.Text.RegularExpressions;

如果我没有弄错你的问题,你是在试图用一封可能来自其他来源的电子邮件来替换(电子邮件)的字面意思

var text = "name +value (email)";
var emailAddress = "someone@test.com";
text = Regex.Replace(text, @"\(email\)", emailAddress);
上面的代码块将用
emailAddress
变量的内容替换“(电子邮件)”

请确保将适当的using语句添加到代码文件的顶部

using System.Text.RegularExpressions;

在我的机器上,您的代码的变化是最快的(您的代码排在第二位)

注意单位滴答声的增量为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 测试代码

[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(@"\(([\w@]+)\)");
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());
}
[测试]
公众假期
{
常量字符串输入=“名称+值(电子邮件)”;
TestGivenMethod(输入、拆分替换、“拆分替换”);
TestGivenMethod(输入,JustSplit,“Split”);
TestGivenMethod(输入,带有Regex,“Regex”);
TestGivenMethod(输入,WithLinq,“WithLinq”);
}
私有void TestGivenMethod(字符串输入、Func方法、字符串名称)
{
Assert.AreEqual(“电子邮件”,方法(输入));
var sw=Stopwatch.StartNew();
字符串res=“”;
对于(int i=0;i<1000000;i++)
{
var电子邮件=方法(输入);
res=电子邮件;
}
sw.Stop();
断言.AreEqual(“电子邮件”,res);
WriteLine(“{1}每次调用{0}个记号”,sw.ElapsedTicks/1000000.0,name);
}
字符串拆分替换(字符串值)
{
string[]parts=val.Split(“(”);
返回部件[1]。替换(“)”,字符串。空);
}
字符串JustSplit(字符串val)
{
字符串[]parts=val.Split(“(”,“)”);
退货零件[1];
}
私有静态正则表达式method3Regex=newregex(@“\([\w@]+)\)”;
带正则表达式的字符串(字符串值)
{
返回方法3regex.Match(val).Groups[1]。值;
}
字符串WithLinq(字符串val)
{
返回新字符串(val.SkipWhile(c=>c!='(')).Skip(1.TakeWhile(c=>c!='))).ToArray();
}

在我的机器上,您的代码变化最快(您的代码排在第二位)

注意单位滴答声的增量为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 测试代码

[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(@"\(([\w@]+)\)");
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());
}
[测试]
公众假期
{
常量字符串输入=“名称+值(电子邮件)”;
TestGivenMethod(输入、拆分替换、“拆分替换”);
TestGivenMethod(输入,JustSplit,“Split”);
TestGivenMethod(输入,带有Regex,“Regex”);
TestGivenMethod(输入,WithLinq,“WithLinq”);
}
私有void TestGivenMethod(字符串输入、Func方法、字符串名称)
{
Assert.AreEqual(“电子邮件”,方法(输入));
var sw=Stopwatch.StartNew();
字符串res=“”;
对于(int i=0;i<1000000;i++)
{
var电子邮件=方法(输入);
res=电子邮件;
}
sw.Stop();
断言.AreEqual(“电子邮件”,res);
WriteLine(“{1}每次调用{0}个记号”,sw.ElapsedTicks/1000000.0,name);
}
字符串拆分替换(字符串值)
{
string[]parts=val.Split(“(”);
返回部件[1]。替换(“)”,字符串。空);
}
字符串JustSplit(字符串val)
{
字符串[]parts=val.Split(“(”,“)”);
退货零件[1];
}
私有静态正则表达式method3Regex=newregex(@“\([\w@]+)\)”;
带正则表达式的字符串(字符串值)
{
返回方法3regex.Match(val).Groups[1]。值;
}
字符串WithLinq(字符串val)
{
返回新字符串(val.SkipWhile(c=>c!='(')).Skip(1.TakeWhile(c=>c!='))).ToArray();
}

现在的性能有多差?我这样问是因为你想要最好的性能,但没有提供任何指标来回答问题。性能之间的差异通常可以忽略不计,只有在你运行大型处理循环或运行视频游戏时,你才会注意到它们。如果没有这两个方面,你就不应该去解决“哪一个性能更好”的问题,除非你真的通过使用产品来确定性能是一个问题。现在的性能有多差?我这样问是因为你想要最好的性能,但没有提供任何指标来回答问题。性能之间的差异通常可以忽略不计,只有在你运行大型处理循环或运行视频游戏时,你才会注意到它们。如果没有这两个问题,你就不应该去解决“哪一个性能更好”,除非你通过使用该产品来确定性能是一个问题。回答得好,非常感谢:)回答得好,非常感谢:)