2011-12-30 6 views
1

多くの値をフィルタリングするクラスを作成しています。 他の文字列の文字列を検索/削除/置換する最も良い方法は何ですか?例えば他の文字列の文字列を検索して置き換える最良の方法を探しています

name +value (email)

電子メール、それはどのように使用して取得しますか? Linq?または。Split()?または正規表現ですか?

誰が最高のパフォーマンスを発揮しますか?すべてのヘルプは高く評価され

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

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

現在、私はこれを使用しています。前もって感謝します。

+2

どのように悪いのですか?最高のパフォーマンスを望んでいるが、回答を得るための指標を提供していないので、私は尋ねる。 –

+0

パフォーマンスの違いは、通常はごくわずかです。次のいずれかに該当する場合にのみ気付くでしょう。処理の大きなループを実行する、またはビデオゲームを実行する。いずれにしても、製品を使用してパフォーマンスが実際に問題であると特定しないかぎり、「より良いパフォーマンスです」に取り組むべきではありません。 – Dracorat

答えて

2

私のマシンでは、AVあなたのコードのariationが最速です(あなたの秒で来る)。

注記ティックは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

0

String.Splitは、Regular Expressionと比較して最も簡単でわかりやすいアプローチであり、どのようにLINQをここに収めることができますか?

限りのパフォーマンスは、あなたが正規表現とのstring.Split

2

間の実際のパフォーマンスの違いを見るためにあなたのテストデータに対するプロファイリングを行うことができれば、それは最高のだろう懸念しているとして、私はそれが発明されたと思うと、私は正規表現をお勧めしますこの理由のために、文字列と文字列の置換を検索します。

2

私が正しくあなたの質問を理解していれば、あなたはおそらく別のソース

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

から上記のコードブロックを提供し、電子メールで(メール)のリテラルを交換しようとしていることを「(Eメール)」を置き換えますemailAddress変数

の内容は、コードファイルの先頭に適切なusingステートメントを追加してください

using System.Text.RegularExpressions;