2015-01-06 34 views
23

Uygulamam bir dizgi karşılaştırmasında başarısız oluyor. Bir kesme noktası koymak ve sonra Visual Studio ara pencereyi kullanılan ve bu imkansız olacak gibi görünüyor şu deneyiC# string karşılaştırma hatası

subject 

"<#MethodResourceObjectives​>" 

subject.Contains("<#Method") 

true 

subject.Contains("<#MethodResource") 

true 

subject.Contains("<#MethodResourceObjectives") 

true 

subject.Contains("<#MethodResourceObjectives>") 

false 

yapmış, herkes neyi oluyor edilebilecek bir ipucu var?

+5

Belki ">" aynı görsel temsil hakkına sahip farklı karakterler? – Codor

+2

belki de sana yalan söylüyor! – dotctor

+0

@joe, Sorununuza çözüm bulmak için, konu değerinin, başkaları tarafından belirtildiği gibi yazdırılamayan karakterler içerdiği ile karşılaştırıldığı değeri (sabit değer) değiştirebilirsiniz. – Satyajit

cevap

55

"s" ile ">" arasında yazdırılamayan bir karakter olabileceği anlaşılıyor.

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

tabii :(

Aslında

, sadece kopyalama ve yapıştırma, derhal pencereden olarak uygun değil:

Genellikle bir dize gerçek içeriğini göstermek için böyle bir şey kullanmak metniniz benim Unicode Explorer (sayfanın en altında), bu gerçekten sorun gibi görünüyor - >'dan önce bir U+200B (sıfır genişlik alanı) var. Bunun nereden geldiğini öğrenmelisiniz.

+1

Ya da '>' – leppie

+3

sonra vardır. Ben kontrol etmek için dotnetfiddle için dize kopyaladı ve yapıştırdı ve> gösterir önce bir karakter var. – AndrewC

+2

@leppie, neden '' '' den sonra herhangi bir (yazdırılabilir/yazdırılamaz) sembol ** için ("<# MethodResourceObjectives>") == false' – Sinatr

27

Metnin bir kopyasını/yapıştırarak, aynı davranışı doğrulayabilirim.

Çıktı:

"<#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 '>' 

Sonra

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

Bunu Jon Skeet'in konuya işaret ettiği gibi bunu bir topluluk vikisi olarak ekledim. Yorum yapmak için çok uzun sürdü. – leppie