12

所以在 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 转换为字符串,然后在字符串上进行比较,但字符串比较是一个很长的字符串进行比较。

任何建议都将不胜感激。

4

6 回答 6

17

您可以创建一个对您有用的地方。System.Collections.Generic.Dictionary<Guid, ...>...

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

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

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

于 2012-06-22T12:24:12.940 回答
7

使用 c#7,您现在可以使用带有模式匹配的 switch来实现此目的。

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"..") 变量,这也有效。

于 2018-12-18T09:13:42.517 回答
3

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

在您的班级顶部添加:

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

然后在你的方法中:

if(gMyGuid == guidVal1)
else if .... 
于 2012-06-22T12:24:09.600 回答
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 存储在 a 中Dictionary,并使用其中的值来存储每个的处理程序。

于 2012-06-22T12:38:15.783 回答
1

我会创建一个 HashSet(T) 的 Guid,在启动时对其进行初始化。

而不是冗长的 'if , if, if ' 你得到一个

if (GuidHashSet.Contains(gMyGuid)) {}

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

将它们全部设为 Guid(仅一次),因为 Guid == Guid 使用 Guid 的内部数据来比较它们(在 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 回答