2015-01-06 13 views
23

L'applicazione non funziona durante il confronto tra stringhe. Ho messo in un punto di interruzione e poi utilizzato la finestra intermedia di Visual Studio e fatto il seguente esperimentoErrore di comparazione stringhe C#

subject 

"<#MethodResourceObjectives​>" 

subject.Contains("<#Method") 

true 

subject.Contains("<#MethodResource") 

true 

subject.Contains("<#MethodResourceObjectives") 

true 

subject.Contains("<#MethodResourceObjectives>") 

false 

Questo sembrerebbe essere impossibile, qualcuno ha avuto la minima idea di che cosa potrebbe accadere?

+5

Forse il ">" sono diversi personaggi che hanno la stessa rappresentazione visiva? – Codor

+2

forse ti sta mentendo! – dotctor

+0

@joe, per risolvere il problema, è possibile modificare il valore (valore costante) a cui viene confrontato il valore dell'oggetto poiché contiene caratteri non stampabili, come indicato da altri. – Satyajit

risposta

55

Sembra che possa esistere un carattere non stampabile tra "s" e ">".

io di solito uso qualcosa di simile per mostrare il vero contenuto di una stringa:

for (int i = 0; i < text.Length; i++) 
{ 
    Console.WriteLine("{0:x4}", (int) text[i]); 
} 

Questo non è così conveniente da una finestra immediata, naturalmente :(

In realtà, semplicemente copiando e incollando il tuo testo nel mio Unicode Explorer (nella parte inferiore della pagina), sembra che questo sia davvero il problema - hai uno U+200B (spazio di larghezza zero) prima dello >. Devi capire da dove viene.

+1

Oppure dopo '>' – leppie

+3

C'è. Ho copiato e incollato la sua stringa in dotnetfiddle per controllare e c'è un carattere prima di quello che appare. – AndrewC

+2

@leppie, perché 'subject.Contains (" <# MethodResourceObjectives> ") == false' per qualsiasi simbolo (stampabile/non stampabile) ** dopo **'> '? – Sinatr

27

Facendo una copia/incolla del testo, posso confermare lo stesso comportamento.

uscita:

"<#MethodResourceObjectives>".ToCharArray() 
{char[27]} 
    [0]: 60 '<' 
    [1]: 35 '#' 
    [2]: 77 'M' 
    [3]: 101 'e' 
    [4]: 116 't' 
    [5]: 104 'h' 
    [6]: 111 'o' 
    [7]: 100 'd' 
    [8]: 82 'R' 
    [9]: 101 'e' 
    [10]: 115 's' 
    [11]: 111 'o' 
    [12]: 117 'u' 
    [13]: 114 'r' 
    [14]: 99 'c' 
    [15]: 101 'e' 
    [16]: 79 'O' 
    [17]: 98 'b' 
    [18]: 106 'j' 
    [19]: 101 'e' 
    [20]: 99 'c' 
    [21]: 116 't' 
    [22]: 105 'i' 
    [23]: 118 'v' 
    [24]: 101 'e' 
    [25]: 115 's' 
    [26]: 62 '>' 

Poi

subject.ToCharArray() 
{char[28]} 
    [0]: 60 '<' 
    [1]: 35 '#' 
    [2]: 77 'M' 
    [3]: 101 'e' 
    [4]: 116 't' 
    [5]: 104 'h' 
    [6]: 111 'o' 
    [7]: 100 'd' 
    [8]: 82 'R' 
    [9]: 101 'e' 
    [10]: 115 's' 
    [11]: 111 'o' 
    [12]: 117 'u' 
    [13]: 114 'r' 
    [14]: 99 'c' 
    [15]: 101 'e' 
    [16]: 79 'O' 
    [17]: 98 'b' 
    [18]: 106 'j' 
    [19]: 101 'e' 
    [20]: 99 'c' 
    [21]: 116 't' 
    [22]: 105 'i' 
    [23]: 118 'v' 
    [24]: 101 'e' 
    [25]: 115 's' 
    [26]: 8203 '​' <--------- input string contains 'garbage' 
    [27]: 62 '>' 
+9

Ho aggiunto questo come wiki della comunità, dato che Jon Skeet ha già sottolineato il problema. Era troppo lungo per un commento. – leppie