因此在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转换为字符串然后比较字符串,但字符串比较是一个非常长的字符串用于比较。
感谢任何建议。
答案 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来自哪里,但您可以考虑将代码重构为策略模式,以使其更易于维护,如评论者所述。
这篇文章是一个很好的总结:
答案 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)
...