C# MyGuid.Equals(其他GUID)不相等?

C# MyGuid.Equals(其他GUID)不相等?,c#,guid,compare,C#,Guid,Compare,当我使用MyGuid.ToString()时,等于(OtherGuid.ToString()) 它们是相等的,为什么我比较纯Guid时它们不相等 更新: 这里的问题可能是我使用了第三方控件 下面的.Key具有Guid,committeeId也是Guid。只有当我这样做的时候,他们才是平等的 两个Guid上的ToString()是相等的,这很奇怪 for (int i = 0; i < this.ultraCalendarInfo.Owners.Count; i++)

当我使用MyGuid.ToString()时,等于(OtherGuid.ToString())

它们是相等的,为什么我比较纯Guid时它们不相等

更新:

这里的问题可能是我使用了第三方控件

下面的.Key具有Guid,committeeId也是Guid。只有当我这样做的时候,他们才是平等的

两个Guid上的ToString()是相等的,这很奇怪

 for (int i = 0; i < this.ultraCalendarInfo.Owners.Count; i++) 
                if (ultraCalendarInfo.Owners[i].Key.ToString().Equals(committeeId))
                    ultraCalendarInfo.Owners[i].Visible = isVisible; 
for(int i=0;i
我无法重现该问题:

using System;

class Program
{
    static void Main(string[] args)
    {
        Guid x = Guid.NewGuid();
        Guid y = new Guid(x.ToString());

        Console.WriteLine(x == y);
        Console.WriteLine(x.Equals(y));
        Console.WriteLine(x.ToString() == y.ToString());
    }
}
产生:

True
True
True
请给出一个类似的简短但完整的程序来演示这个问题

编辑:我想我现在看到了问题所在,它存在于您的代码中:

if (ultraCalendarInfo.Owners[i].Key.ToString().Equals(committeeId))
你说过:

下面的
.Key
有一个Guid,
committeeId
也是一个Guid

您正在Guid上调用
ToString()
,而不是在
committeeId
上调用,因此该条件永远不会为真。如果在两个或两个上都调用了
ToString()
,应该可以


我强烈怀疑这就是问题所在(或者类似的东西,如果上面的代码不是您真正的代码的话)。当然,多次调用
ToString()
(即
guid.ToString().ToString()
等)将始终返回相同的字符串-因此,如果调用
ToString()
的次数不平衡(一侧为0,另一侧为1),则向两侧添加额外调用将“修复”问题。。。但是删除一个
ToString()
调用才是真正的解决办法。

考虑下面的代码

object g1 = Guid.NewGuid();
object g2 = new Guid(((Guid)g1).ToByteArray());
Console.WriteLine("{0}\r\n{1}", g1, g2);
Console.WriteLine("   Equals: {0}", g1.Equals(g2));
Console.WriteLine("Object ==: {0}", g1 == g2);
Console.WriteLine(" Value ==: {0}", (Guid)g1 == (Guid)g2);

将GUID存储在类型为“object”的变量中具有将其“装箱”到引用类型的效果。使用“==”比较引用类型时,即使其中包含的值相等,它们也可能不相等。这与值类型不同,因为如果将上面的g1和g2声明为Guid,则所有相等性测试都将为True。但是上面的代码对于“==”测试返回False。请注意,如果如第三个测试中所示“取消框选”这些值,它将看到这些值相等。如果您使用“Equals”方法,它还将看到它们是相等的,可以(并且是)重写该方法,以便根据对象的特定类型对对象执行更智能的比较。

由于您没有显示这两个guid的声明,所以我唯一能想到的是它们是不同的guid类型(我在这里使用SqlGuid作为示例):


你能给出这些guid的值吗?这对我来说似乎很好。。。然后发布更多的代码,也许你在其他地方犯了错误,告诉我们失败的代码。我的评论可能无法解决你的问题,但只是一个建议,因为你正在将GUID转换为字符串,然后进行比较。从数据库中获取GUID值时,将始终以小写形式接收它。在这种情况下,转换后,请在两个GUID字符串值上使用us ToLower()方法,以确保得到正确的结果。@John erhmmm。。。很抱歉,我在committeeId的顶部不可见的代码行中插入了字符串()。。。我没有发布:P@Panella:请用一个完整的程序更新您的帖子,该程序实际演示了问题。我已经给出了一个例子,它显示了所有的工作-你应该尝试提供一个类似的,独立的例子,我们可以运行,看看发生了什么。仅仅是片段——尤其是不准确的片段——不会有多大帮助。
 Sub Main()

        Dim stringValue = Guid.NewGuid().ToString()

        Dim first = New Guid(stringValue)
        Dim second = New SqlTypes.SqlGuid(stringValue)

        Console.WriteLine(first = second)    'True'
        Console.WriteLine(first.Equals(second))    'False'
        Console.WriteLine(first.ToString() = second.ToString())    'True'
        Console.ReadKey()

    End Sub