将 Guid 与字符串进行比较
Comparing Guid with string
令我惊讶的是,我在 Google 或此处都找不到答案,但是比较 string
和 [=12= 的最佳方法是什么? ] 考虑大小写,并在适当时考虑性能
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
作为字符串进行比较,也不要从字符串创建新的 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 倍常数值。
详述 D Stanley
const string sid = "3f72497b-188f-4d3a-92a1-c7432cfae62a";
static readonly Guid guid = new Guid(sid);
static void Main()
{
Guid gid = Guid.NewGuid(); // As an example, say this comes from the db
Measure(() => (gid.ToString().ToLower() == sid.ToLower()));
// result: 177 ms
Measure(() => (gid == new Guid(sid)));
// result: 113 ms
Measure(() => (gid == guid));
// result: 6 ms
Measure(() => (gid == Guid.Parse(sid)));
// result: 114 ms
Measure(() => (gid.Equals(sid)));
// result: 7 ms
}
// Define other methods and classes here
public static void Measure<T>(Func<T> func)
{
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
for (int i = 1; i < 1000000; i++)
{
T result = func();
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
}
因此,如果您不能将 guid 存储在常量中,内置的 Guid.Equals() 是您的首选。
令我惊讶的是,我在 Google 或此处都找不到答案,但是比较 string
和 [=12= 的最佳方法是什么? ] 考虑大小写,并在适当时考虑性能
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
作为字符串进行比较,也不要从字符串创建新的 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 倍常数值。
详述 D Stanley
const string sid = "3f72497b-188f-4d3a-92a1-c7432cfae62a";
static readonly Guid guid = new Guid(sid);
static void Main()
{
Guid gid = Guid.NewGuid(); // As an example, say this comes from the db
Measure(() => (gid.ToString().ToLower() == sid.ToLower()));
// result: 177 ms
Measure(() => (gid == new Guid(sid)));
// result: 113 ms
Measure(() => (gid == guid));
// result: 6 ms
Measure(() => (gid == Guid.Parse(sid)));
// result: 114 ms
Measure(() => (gid.Equals(sid)));
// result: 7 ms
}
// Define other methods and classes here
public static void Measure<T>(Func<T> func)
{
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
for (int i = 1; i < 1000000; i++)
{
T result = func();
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
}
因此,如果您不能将 guid 存储在常量中,内置的 Guid.Equals() 是您的首选。