我很惊讶我无法在Google或SO上找到答案,但考虑到案例,以及在适当的情况下,将string
与Guid
进行比较的最佳方式是什么?
const string sid = "XXXXX-...."; // This comes from a third party library
Guid gid = Guid.NewGuid(); // This comes from the db
if (gid.ToString().ToLower() == sid.ToLower())
if (gid == new Guid(sid))
// Something else?
更新:为了使这个问题更具吸引力,我将sid
改为const
......因为你不能拥有Guid const
这是我正在处理的真正问题。
不要将Guid
s比作字符串,也不要从字符串创建新的Guid
,只是为了将它与现有的Guid
进行比较。
除了性能之外,没有一种标准格式可以将Guid
表示为字符串,因此您冒着比较不兼容格式的风险,并且必须通过配置String.Compare
来执行此操作或将每个格式转换为小写来忽略大小写。
一种更惯用且更高效的方法是使用常量字符串值创建静态的,只读的Guid
,并使用本机Guid相等性进行所有比较:
const string sid = "3f72497b-188f-4d3a-92a1-c7432cfae62a";
static readonly Guid guid = new Guid(sid);
void Main()
{
Guid gid = Guid.NewGuid(); // As an example, say this comes from the db
Measure(() => (gid.ToString().ToLower() == sid.ToLower()));
// result: 563 ms
Measure(() => (gid == new Guid(sid)));
// result: 629 ms
Measure(() => (gid == guid));
// result: 10 ms
}
// Define other methods and classes here
public void Measure<T>(Func<T> func)
{
Stopwatch sw = new Stopwatch();
sw.Start();
for(int i = 1;i<1000000;i++)
{
T result = func();
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
}
所以字符串比较和从常数值创建一个新的Guid
比将Guid
与从常数值创建的静态只读Guid
相比要贵50-60倍。