在C#中打开Guid的最有效方法

时间:2012-06-22 12:20:47

标签: c# performance guid

因此在C#中,switch语句只支持整数类型(而不是Guids),因此一个简单的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转换为字符串然后比较字符串,但字符串比较是一个非常长的字符串用于比较。

感谢任何建议。

8 个答案:

答案 0 :(得分:17)

您可以创建System.Collections.Generic.Dictionary <Guid, ...>,其中...对您有用。

在程序启动时,使用您需要识别的guid和值填充字典。

然后,使用字典的TryGetValue方法通过其guid检索值。

我没有为...说明任何字面意思,因为我不知道你想用guid做什么。也许你想运行一些函数,然后一个方法指针(Func<T>或类似的东西)可能是合适的,或者是一个提供你想要调用的方法的接口类型。这取决于比较代码的guid的上下文/目的。

答案 1 :(得分:4)

也许这些链接会回答你的问题......

How expensive is a GUID cast and comparison vs a string comparison

Performance - using Guid object or Guid string as Key

如果没有别的东西它包含一个程序的起点,可以对你想要尝试的任何方法进行基准测试。

答案 2 :(得分:3)

将比较值创建为静态,因此您只创建一次。

在课程顶部添加:

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

然后在你的方法中:

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

答案 3 :(得分:3)

使用c#7,您现在可以为此使用Pattern Matching开关。

switch (gMyGuid )
{
    case var g when (g == new Guid("VALUE")):
        break;
    case var g when (g == new Guid("VALUE2")):
        break;
    case var g when (g == new Guid("VALUEN")):
        break;
    default:
        break;
}

如果您已定义静态只读的新Guid“ ..”)变量,这也将起作用。

答案 4 :(得分: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中,并使用其中的值来存储每个的处理程序。

答案 5 :(得分:1)

我不知道您的GUID来自哪里,但您可以考虑将代码重构为策略模式,以使其更易于维护,如评论者所述。

这篇文章是一个很好的总结:

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

答案 6 :(得分:1)

我创建一个Guids的HashSet(T),在启动时初始化它。

而不是lengty'if,if,if'你得到了

if (GuidHashSet.Contains(gMyGuid)) {}

如果需要,您可以向HashSet添加新Guids。 HashSet Contains()是一个O(1)操作。

让他们成为所有Guids(只需一次)作为Guid == Guid使用Guid的内部数据来比较它们(等于在Guid.cs中重载)。所以比较Guid == Guid是最快的。 HastSet会做什么。

答案 7 :(得分:0)

Guid相等运算符(==)被重载,因此仅比较值:

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

if(gMyGuid == myGuid)
...