2012-06-22 35 views
9

因此在C#中switch語句只支持整型(不是Guid),所以簡單的O(1)比較表看起來不可能。在C中切換Guid的最有效方法#

什麼是最有效的計算方法來

匹配一個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轉換爲字符串,然後在字符串上進行比較,但字符串比較是相當長的字符串,用於比較。

任何建議感激地收到。

+3

而不是比較字符串表示? – chiccodoro

+2

C#'switch'語句不僅支持整型。例如,它也支持字符串。但是,它要求在編譯時測試案例標籤。 –

+1

或者您只定義一次要比較的GUID,並在每次進行比較時重新使用它們。這樣,您可以依靠實施GUID比較的人員來優化這一點。 – chiccodoro

回答

17

您可以創建一個System.Collections.Generic.Dictionary<Guid, ...>其中...對你有用的東西。

程序啓動時,用你需要識別的GUID和值填充字典。

然後,使用字典的TryGetValue方法通過其guid檢索值。

我還沒有爲...聲明任何字面意義,因爲我不知道你想用GUID做什麼。也許你想運行一些函數,然後一個方法指針(Func<T>或類似的東西)可能是合適的,或者是提供你想調用的方法的接口類型。這取決於該guid比較代碼的上下文/目的。

+4

如果您確實沒有需要匹配的值,則可以使用「HashMap 」而不是「Dictionary」。不過,我懷疑你會這麼做,因爲你在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,這裏有很多,所以我需要爲每個比較者創建一個新的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; 
} 

當然,它不是徒有其表,但我認爲這是最快的構造可能。另外,你當然可以將你所有的比較指南存儲在Dictionary中,並使用它中的值爲每個指針存儲一個處理程序。

1

我不知道您的GUID來自哪裏,但您可以考慮將代碼重構爲戰略模式,以使其更易維護,正如評論者所提到的。

這篇文章是一個很好的總結:

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

+0

這只是一個測試案例場景,而不是真實世界的實現:) –

1

我想創建一個HashSet的GUID(T),在啓動時初始化。

取而代之的是lengty的「如果,如果,如果」你得到一個

if (GuidHashSet.Contains(gMyGuid)) {} 

,你可以在需要時添加新的GUID到HashSet的。 HashSet Contains()是一個O(1)操作。

將它們全部Guids(只是一次)作爲Guid == Guid使用Guid的內部數據來比較它們(等於在Guid.cs中重載)。所以比較Guid == Guid是最快的。 HastSet會做什麼。

相關問題