2016-06-27 45 views
0

私はGoogleやSOのどちらでもこの回答を見つけることができませんでしたが、stringGuidを比較する最良の方法は、 、パフォーマンスGuidと文字列を比較する

const string sid = "XXXXX-...."; // This comes from a third party library 
Guid gid = Guid.NewGuid(); // This comes from the db 

if (gid.ToString().ToLower() == sid.ToLower()) 

if (gid == new Guid(sid)) 

// Something else? 

更新: この質問は、より魅力的なようにするには、私はconstsidを変更...そしてあなたはGuid constを持つことができないので、これは私が取り扱っております本当の問題です。

+0

自分でプロファイルしてみませんか? –

+0

「他のものがあるかどうかわからないから」 –

+1

文字列として比較する必要がありますか?それらを比較する最も良い方法は、おそらくあなたが何百万回も連続して何かをやっているのでなければ、それらを 'Guid'タイプ(すなわち' gid == new Guid(sid); ')として比較することです。 – itsme86

答えて

6

Guidを文字列として比較しないでください。既存のGuidと比較するための文字列を新しいGuidという形式で作成しないでください。

パフォーマンスは別として、文字列としてGuidを表す単一の標準フォーマットがないため、互換性のないフォーマットを比較する危険性があり、大文字と小文字を無視する必要があります。String.Compareを設定するか、小文字

はるかに慣用とパフォーマンスの方法は、読み取り専用Guid定数文字列値からおよびネイティブのGuidの平等を使用してすべての比較に、静的を作成することです:

const string sid = "3f72497b-188f-4d3a-92a1-c7432cfae62a"; 
static readonly Guid guid = new Guid(sid); 

void Main() 
{ 
    Guid gid = Guid.NewGuid(); // As an example, say this comes from the db 

    Measure(() => (gid.ToString().ToLower() == sid.ToLower())); 
    // result: 563 ms 

    Measure(() => (gid == new Guid(sid))); 
    // result: 629 ms 

    Measure(() => (gid == guid)); 
    // result: 10 ms 

} 

// Define other methods and classes here 
public void Measure<T>(Func<T> func) 
{ 
    Stopwatch sw = new Stopwatch(); 

    sw.Start(); 
    for(int i = 1;i<1000000;i++) 
    { 
     T result = func(); 
    } 
    sw.Stop(); 

    Console.WriteLine(sw.ElapsedMilliseconds); 
} 

だから、文字列の比較から新しいGuidを作成します定数値から作成された静的な読み取り専用GuidGuidを比較する場合に比べて、50〜60倍のコストがかかります。

+0

これは理想的なアプローチです。問題の心配はさておき、意図したとおりにデータを保存する( 'Guid'は' Guid'sなど)、問題に遭遇する可能性ははるかに低い。 –