2017-07-11 6 views
-2

Je travaille sur un projet et pour une partie je dois comparer 2 chaînes. Mon problème est que chaque fois que je tente de les comparer, je reçois toujours faux (==, .Equals(), String.Equals() - ils sont tous faux retour, même si j'ai 2 cordes complètement identiques)C# String.Equals renvoie false sur des chaînes identiques

est ici une partie de mon code.

var tagType = JObject.Parse(json).First.First.ToString(); 
foreach (var type in assembly.ExportedTypes) 
{ 
    var name = tagType; 
    var currentType = type.Name; 

    var a = name.Length; 
    var b = currentType.Length; 

    var result = currentType == name; 
    var result1 = currentType.Equals(name); 
    var result2 = String.Equals(name, currentType, StringComparison.CurrentCulture); 
    var result3 = String.Equals(name, currentType, StringComparison.InvariantCulture); 
    var result4 = String.Equals(name, currentType, StringComparison.Ordinal); 
    var result5 = String.Equals(name, currentType, StringComparison.CurrentCultureIgnoreCase); 
} 

maintenant lors du débogage mon foreach, je fini par atteindre un point où le nom et currentType tous deux égaux la même chaîne - « AutoIncrementTag ». Au même point, leurs longueurs (a et b) sont égales - 16 caractères.

C'est ce que la sortie de débogage ressemble:

//name -  "AutoIncrementТаg" 
//currentType - "AutoIncrementTag" 

//a - 16 
//b - 16 

// result - false 
// result1 - false 
// result2 - false 
// result3 - false 
// result4 - false 
// result5 - false 

Et toutes les comparaisons ci-dessous fausse déclaration.

J'ai même essayé de créer une nouvelle chaîne à partir de "nom" et de currenType. Et rien.

Je suis vraiment coincé ici. Comment deux chaînes identiques (de même longueur, donc pas de caractères cachés) peuvent renvoyer false avec n'importe quel type de comparaison.

+0

Si 'String.Equals' retourne false, les chaînes ne sont pas identiques. Quelle est la valeur du résultat lors du débogage? –

+0

Pouvez-vous fournir un exemple vérifiable? Juste par code de plan, il semble que vos chaînes ne sont pas égales. – Link

+0

Juste édité mon message pour montrer la sortie de débogage qui m'inquiète. J'espère que cela illustre mon problème. (Les valeurs sont toutes copiées/collées depuis la fenêtre de débogage) – Kobek

Répondre

5

La deuxième et troisième derniers caractères derniers ne sont pas les mêmes. L'un des deux derniers caractères est http://www.fileformat.info/info/unicode/char/0061/index.htm et l'autre http://www.fileformat.info/info/unicode/char/0430/index.htm. Ils ressemblent le même, mais ne sont pas réellement les mêmes.

Pour le voir, exécutez ce programme:

using System; 

namespace ConsoleApplication4 
{ 
    class Program 
    { 
     static string GetEscapeSequence(char c) 
     { 
      return "\\u" + ((int)c).ToString("X4"); 
     } 

     static void Main(string[] args) 
     { 
      var name = "AutoIncrementТаg"; 
      var currentType = "AutoIncrementTag"; 

      foreach (var character in name) 
      { 
       Console.WriteLine(GetEscapeSequence(character)); 
      } 

      Console.WriteLine("second string"); 
      foreach (var character in currentType) 
      { 
       Console.WriteLine(GetEscapeSequence(character)); 
      } 

      Console.ReadLine(); 
     } 
    } 
} 
+0

Merci pour la réponse. M'a beaucoup aidé. J'ai fini par renommer mon nom de classe par celui que j'avais, et cela fonctionne correctement maintenant – Kobek

+0

Ces sortes de problèmes sont de véritables gratte-tête! – mjwills

-1

Le code semble correct. Pouvez-vous essayer de convertir nom et currentType variable en chaîne de type de données avant de comparer.

String name = tagType; 
      String currentType = type.Name; 

      var a = name.Length; 
      var b = currentType.Length; 
      var result = currentType == name; 

      var result2 = String.Equals(name, currentType, StringComparison.CurrentCulture); 
      var result3 = String.Equals(name, currentType, StringComparison.InvariantCulture); 
      var result4 = String.Equals(name, currentType, StringComparison.Ordinal); 
      var result5 = String.Equals(name, currentType, StringComparison.CurrentCultureIgnoreCase); 
1

Pour les deux chaînes, comparez également les tableaux d'octets.

string string1 = "AutoIncrementТаg"; 
string charArray = string.Join(",", string1.ToCharArray().Select(s => (int)s)); 

Pour "AutoIncrementTag" vous devriez obtenir:

65,117,116,111,73,110,99,114,101,109,101,110,116,1058,1072,103 
+0

Ils semblent différents. Merci pour la suggestion. Je vais essayer de découvrir pourquoi cela se passe. Merci pour l'idée :) – Kobek

+0

En fait, je dois avoir coupé et collé la mauvaise chaîne. Les deux nombres élevés (1058 et 1072) doivent être les mauvais caractères. – Derek