2013-03-19 55 views
3

我很明顯錯過了這裏的東西..IndexOf C錯誤#

我正在寫一個函數,返回由特定字符串分隔的子字符串的數量。 這裏是相當簡單的功能 -

public static FuncError DCount(String v1, String v2, ref Int32 result) { 
     result = 0; 
     if (String.IsNullOrEmpty(v1)) { 
      return null; 
     } 
     if (String.IsNullOrEmpty(v2)) { 
      return null; 
     } 

     int ct = 1; 
     int ix = 0; 
     int nix = 0; 

     do { 
      nix = v1.IndexOf(v2, ix); 
      if (nix >= 0) { 
       ct++; 

       System.Diagnostics.Debug.Print(
string.Format("{0} found at {1} count={2} result = {3}", 
v2, nix, ct, v1.Substring(nix,1))); 
       ix = nix + v2.Length; 
      } 
     } while (nix >= 0); 
     result = ct; 
     return null; 
    } 

問題是當我與正被用作在特定情況下的隔板的特殊字符調用。它返回了很多誤報。從Debug.Print中,第一個和最後一個參數應該始終相同。

þ found at 105 count=2 result = t 
þ found at 136 count=3 result = t 
þ found at 152 count=4 result = þ 
þ found at 249 count=5 result = t 
þ found at 265 count=6 result = t 
þ found at 287 count=7 result = t 
þ found at 317 count=8 result = t 
þ found at 333 count=9 result = þ 
þ found at 443 count=10 result = þ 
þ found at 553 count=11 result = þ 
þ found at 663 count=12 result = þ 
þ found at 773 count=13 result = þ 
þ found at 883 count=14 result = þ 
þ found at 993 count=15 result = þ 

如果我通過+作爲char它工作正常。 如果我使用þ作爲分隔符來分割字符串,它將返回正確數目的元素。 至於錯誤識別的't',結果中還有其他't'沒有被拾取,所以它不是一個字符轉換問題。

困惑......

感謝

+0

試着給出變量的正確名稱。它會幫助你以及我們很多 – Sachin 2013-03-19 13:05:46

+1

你可以在這裏發佈用於測試的實際代碼,這意味着調用該函數的代碼?最好通過逃避特殊字符,所以我們不必依賴網絡編碼來傳達正確的。 – 2013-03-19 13:07:13

+0

字符串比較對於產生意想不到的結果有一個訣竅。始終明確要使用的比較規則。這裏可能應該是StringComparison.Ordinal。 – 2013-03-19 13:13:26

回答

5

這裏的問題是不同的文化如何表示的字符,並在某些情況下,將它們組合起來。

您正在尋找的信件,Thorn,顯然可以用th字母表示。

試試這個代碼LINQPad

void Main() 
{ 
    string x = "uma thurman"; 
    x.IndexOf("þ").Dump(); 
} 

它將輸出4

(請注意,我在挪威的機器上運行這個程序,它可能會或可能不會對結果產生影響)

這是同樣的「問題」作爲雙S德國信 - ß-可以在兩個s的詞語中找到,在某些文化中

+0

注意:這不是一個Sho原始海報,你正在使用,這是一個刺的信。前者來自古希臘,不等同於「th」,而後者是北歐信件(Old Norse,Icelandic等),相當於清音「th」,與希臘Theta(Θ)相當。 – 2013-03-19 13:50:35

+0

謝謝。在事後看得太明顯.. – baffled 2013-03-19 13:58:48

+0

@JeppeStigNielsen謝謝,修正。 – 2013-03-19 14:11:11

0

您使用an overload of IndexOf其中:

執行使用當前區域性

一個字(區分大小寫和文化敏感)的搜索結果。因此依賴於你的線程的CurrentCulture。大多數文化認爲letter thorn等同於th。看到Lasse的回答。

例如,古老的北歐神Þórr經常被寫成英語的Thor,第一個字母在「星期四」(Thor的日子)發音爲「Th」。

解決您的問題,改變v1.IndexOf(v2, ix)到:

v1.IndexOf(v2, ix, StringComparison.Ordinal) 

看到the doc on that overload

一個序數比較比較char值以一種天真的方式,只是比較它們的數值。相比之下,依賴於文化的比較在很多正常化方面都做了很多規範化處理,包括重音字母的不同表示,以及文化認爲等效的不同字母。這是在覈對也與序號比較非常重要的,例如字符串"naïve"後在分揀(因爲System.Char'ï'具有數值比's'更高)將字符串"nasty"自帶