12

したがって、C#では、switchステートメントは(Guidではなく)整数型のみをサポートするため、単純なO(1)比較テーブルは不可能に見えます。

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を文字列に変換してから文字列で比較することもできますが、文字列の比較は比較のためにかなり長い文字列です。

どんなアドバイスもありがたいです。

4

6 に答える 6

17

自分にとって便利な場所を作成できます。System.Collections.Generic.Dictionary<Guid, ...>...

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

次に、TryGetValue辞書のメソッドを使用して、そのGUIDによって値を取得します。

...ギッドで何をしたいのかわからないので、文字通り何も述べていません。ある関数を実行したい場合は、メソッドポインタ(Func<T>またはそのようなもの)が適切な場合があります。そうでない場合は、呼び出したいメソッドを提供するインターフェイスタイプが適切です。これは、そのGUID比較コードのコンテキスト/目的によって異なります。

于 2012-06-22T12:24:12.940 に答える
3

比較値を静的として作成し、一度だけ作成します。

クラスの一番上に次を追加します。

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

そしてあなたの方法で:

if(gMyGuid == guidVal1)
else if .... 
于 2012-06-22T12:24:09.600 に答える
2

パフォーマンスが本当に心配な場合は、数値引数を使用するコンストラクターの方がGuid(string)コンストラクターよりも高速です。文字列は含まれず、何も解析する必要はありません。

これは、そのうちの1つの実装です。

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格納し、その値を使用してそれぞれのハンドラーを格納することもできます。

于 2012-06-22T12:38:15.783 に答える
1

GuidのHashSet(T)を作成し、起動時に初期化します。

長さの代わりに'if、if、if'あなたは

if (GuidHashSet.Contains(gMyGuid)) {}

必要に応じて、HashSetに新しいGUIDを追加できます。HashSet contains()はO(1)操作です。

Guid == GuidはGuidの内部データを使用してそれらを比較するため、すべてのGuidを(1回だけ)作成します(Guid.csではequalsがオーバーロードされています)。したがって、Guid==Guidの比較が最速です。HastSetが行うこと。

于 2012-06-22T13:43:16.043 に答える
0

Guid 等値演算子 (==) は、値だけを比較するためにオーバーロードされています。

http://msdn.microsoft.com/en-us/library/system.guid.op_equality(v=VS.90).aspx

if(gMyGuid == myGuid)
...
于 2012-06-22T12:27:39.870 に答える