2012-06-22 8 views
9

C#では、switch文は整数型(Guidsではなく)のみをサポートしているため、単純なO(1)比較テーブルは見えません。C#でguidを有効にする最も効率的な方法

は、私はしかし、比較のために、私は、GUIDの新しいインスタンスを作成していたびにこれを行うことにより、

if(gMyGuid == new Guid("VALUE")) 
else if (gMyGuid == new Guid("VALUE2") 
else if (gMyGuid == new Guid("VALUE3") 
... 
else if (gMyGuid == new Guid("VALUEn") 

を考えた最初のGuidに

に合わせて、最も計算効率的な方法は何ですか。 Guidを文字列に変換して文字列を比較することはできますが、文字列の比較は比較のためにかなり長い文字列です。

いずれかのアドバイスは感謝しています。

+3

代わりに文字列表現を比較しますか? – chiccodoro

+2

C#の 'switch'ステートメントは整数型をサポートするだけではありません。たとえば、文字列もサポートしています。ただし、コンパイル時にテストするケースラベルが必要です。 –

+1

を使用するか、比較するGUIDを1回だけ定義し、比較を行うたびにそれらを再利用します。そうすることで、GUIDの比較を実装した人々に頼ることができます。 – chiccodoro

答えて

17

あなたが作成することができます...は、あなたにとって有用なものであるSystem.Collections.Generic.Dictionary<Guid, ...>

プログラムの起動時に、認識する必要があるguidと値を辞書に入力します。

次に、辞書のTryGetValueメソッドを使用して、guidで値を取得します。

...のリテラルについては何も述べていません。私はあなたが何をしたいのか分かりません。おそらく、いくつかの関数を実行したいと思うかもしれませんし、メソッドポインタ(Func<T>またはそのようなもの)が適切かもしれません。そうでなければ、あなたが呼び出したいメソッドを提供するインタフェースタイプかもしれません。これは、コードを比較するguidのコンテキスト/目的に依存します。

+4

実際に一致する必要のある値がない場合は、 'Dictionary'の代わりに' HashMap 'を使うことができます。私はあなたがif/elseチェーンでそれを使用しているので、あなたがしていると思う。 –

+0

関数の辞書は戦略パターンに似ており、このアプローチを使用すると、それ自身の問題が発生します:http://stackoverflow.com/questions/2316189/guid-newguid-gethashcode-for-db – oasten

3

比較値を静的な値として作成し、一度だけ作成します。あなたのクラスのアドオンの上部に

private static Guid guidVal1 = new Guid("VALUE"); 

そして、あなたの方法で:

if(gMyGuid == guidVal1) 
else if .... 
+0

申し訳ありませんこれはおそらく私の悪いサンプルです、私は問題を更新しましたが、1つの比較guidだけでなく、かなりの数のtheresので、私は試している問題thats各比較者のための新しいGUIDを作成する必要があるでしょう避けるために。 –

2

パフォーマンスについては本当に心配している場合は、数値引数を使ってコンストラクタはより速いですGuid(string)コンストラクタ。関連する文字列はなく、何かを解析する必要はありません。

これはその一つの実装です:

public Guid(int a, short b, short c, byte d, byte e, byte f, byte g, byte h, byte i, byte j, byte k) 
{ 
    this._a = a; 
    this._b = b; 
    this._c = c; 
    this._d = d; 
    this._e = e; 
    this._f = f; 
    this._g = g; 
    this._h = h; 
    this._i = i; 
    this._j = j; 
    this._k = k; 
} 

確かに、それは見てのようにきれいではありませんが、私はそれが最速コンストラクタだと思います。また、すべての比較GuidをDictionaryに格納し、その値を使用してそれぞれのハンドラを格納することもできます。

1

あなたのGUIDがどこから来ているのか分かりませんが、コードを戦略パターンにリファクタリングして、コメント作成者の言葉通りメンテナンス性を高めることができます。

http://jeremyjarrell.org/archive/2007/10/28/64.aspx

+0

これはテストケースのシナリオであり、実際の実装ではありません:) –

1

は、私は、HashSetのGUIDの(T)を作成し、起動時にそれを初期化したい:

この記事では良い要約です。代わりにlengtyの

「もしあれば、もし」あなたは

if (GuidHashSet.Contains(gMyGuid)) {} 

を取得し、必要な場合は、HashSetのに新しいGUIDを追加することができます。 HashSet Contains()はO(1)操作です。

Guid == GuidとしてすべてのGuidsを作成する(GuidはGuidの内部データを使用してそれらを比較します(等しいはGuid.csでオーバーロードされます)。 Guid == Guidを比較すると最速です。 HastSetはどちらを実行しますか。

関連する問題