2010-08-18 4 views
3

Lorsque j'utilise MyGuid.ToString(). Equals (OtherGuid.ToString())MyGuid.Equals (OtherGuid) N'EST PAS ÉGAL?

ils sont égaux, pourquoi ne sont-ils pas égaux quand je compare le Guid pur?

Mise à jour:

Eh bien, le problème ici pourrait être que j'utilise un contrôle 3e partie.

La clé .Key ci-dessous a un Guid et le codeId est également un Guid. Ils n'étaient jamais égaux seulement quand je l'ai fait

ToString() sur les deux guid's ils étaient égaux c'est impair.

for (int i = 0; i < this.ultraCalendarInfo.Owners.Count; i++) 
       if (ultraCalendarInfo.Owners[i].Key.ToString().Equals(committeeId)) 
        ultraCalendarInfo.Owners[i].Visible = isVisible; 
+2

pourrait vous donnez les valeurs de ces GUID? Cela semble fonctionner correctement pour moi ... Et poster plus de code, peut-être que vous avez fait une erreur ailleurs –

+1

Oui, montrez-nous le code qui échoue. – paxdiablo

+0

Mon commentaire ne résout peut-être pas votre requête, mais seulement une suggestion lorsque vous convertissez les GUID en chaîne puis que vous les comparez. Lorsque vous récupérez la valeur GUID dans la base de données, vous la recevez toujours en minuscules. Dans ce cas, après la conversion nous méthode ToLower() sur les deux valeurs de chaîne GUID pour s'assurer que vous obtenez le résultat correct. – Shant

Répondre

11

Je ne peux pas reproduire le problème:

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()); 
    } 
} 

Produit:

True 
True 
True 

S'il vous plaît donner un programme court mais complet similaire qui illustre le problème.

EDIT: Je pense que je vois le problème maintenant, et il est dans votre code:

if (ultraCalendarInfo.Owners[i].Key.ToString().Equals(committeeId)) 

Vous avez dit:

Le .Key ci-dessous a un Guid et committeeId est un Guid trop .

Vous appelez ToString() sur le Guid mais pas sur committeeId, de sorte que cette condition ne sera jamais vrai. Si vous avez appelé ToString() sur à la fois ou ni ça devrait aller.

Je soupçonne fortement que ceci (ou quelque chose de très similaire, si ce qui précède n'est pas votre vrai code) est le problème. Appeler ToString() plus d'une fois (par exemple guid.ToString().ToString() etc) retournera toujours la même chaîne, bien sûr - donc si vous avez un nombre déséquilibré de ToString() appels (0 d'un côté et 1 de l'autre) puis en ajoutant un appel supplémentaire aux deux côtés "corrige" le problème ... mais la suppression de l'un des ToString() appels est le véritable correctif.

+0

J'ai mis à jour mon code d'init avec le code qui s'est passé – Panella

+0

@Panella: Mise à jour de ma réponse pour signaler votre bug. –

+0

@John erhmmm ... désolé je l'ai fait ToString() sur committeeId à la ligne de code invisible en haut ... Je n'ai pas posté: P – Panella

2

le code ci-dessous Tenir compte

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); 

Enregistrement d'un GUID dans une variable de type "objet" a pour effet de celui-ci "boxe" dans un type de référence. Lorsque vous utilisez "==" pour comparer des types de référence, ils peuvent ne pas être égaux même si les valeurs qu'ils contiennent sont égales. C'est une différence par rapport aux types de valeur, car si vous deviez déclarer g1 et g2 ci-dessus comme Guid, vous obtiendriez True pour tous les tests d'égalité. Mais le code ci-dessus renvoie False pour le test "==". Notez que si vous "décapsulez" les valeurs comme indiqué dans le troisième test, il verra que les valeurs sont égales. Il verra également qu'ils sont égaux si vous utilisez la méthode "Equals", qui peut être (et est) surchargée pour effectuer des comparaisons plus intelligentes d'objets en fonction de leurs types spécifiques.

0

Comme vous ne vous présentez pas à la déclaration des deux GUIDs, la seule chose que je peux penser est que ce sont les différents types guid (j'utilise SqlGuid comme un exemple ici):

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