2011-08-04 16 views
1

我在構建一個好的算法時遇到了一些麻煩。這是我的標準:我正在讀取xml文件中的一個字段作爲字符串,並嘗試解釋它以激活一些gui組件。更具體地說,我以字符串形式讀取的字段是「允許的字符」字段,gui組件是根據字段內容激活的複選框。例如,在XML我有標籤解釋字段類型以激活c中的複選框#

<Allowed Field>ABCDEFGHIJKLMNOPQRSTUVWXYZ</Allowed Fields>. 

當我在這個領域作爲字符串讀取,程序應該知道字段內容類型是ALPHA並勾選名爲阿爾法。同樣,如果該字段包含字母數字內容或任何特殊字符。我有三個算法應該解釋的複選框:Alpha,字母數字和特殊字符。我如何構建算法來解釋從xml中讀取的字符串的含義,以表示所提到的字段類型?

感謝

+1

我已經嘗試過一個string.contains。舉例來說,如果一個if語句通過檢查它是否具有A並且不包含0,但這種方式效率不高 – Joe

+0

是的,這不是。但你應該已經發布了一些代碼,所以很明顯你做了一些努力。請看我的回覆。 –

回答

1
static FieldKind AnalyzeKind (string s) 
{ 
    bool hasNumbers, hasSpecial; 

    foreach (char c in s) { 
     if (Char.IsNumber (c)) 
      hasNumbers = true; 

     else if (!Char.IsLetter (c)) 
      return FieldKind.AlphaNumericWithSpecialCharacters; 
    } 

    return (hasNumbers) ? FieldKind.AlphaNumeric : FieldKind.Alpha; 
} 

其餘取決於你定義爲特殊字符(如什麼是空白?標點符號?)。
Char方法供您參考。

+1

如果字符是數字,那麼算法在第一個if語句之後不會中斷,它將返回true,它不是第二個if語句中的字母,然後您將返回SpecialCharacters。你需要休息一下,如果還有第二個,如果還有其他的話。 –

+0

@Gweebz:感謝您發現這一點。我的錯。我不想'打破',因爲它可能仍然是一個特殊的角色,OP沒有完全定義這種「特殊性」,所以我不能馬上測試它。 –

+0

除了a-z和0-9之外,特殊字符基本上都是鍵盤上的其他任何字符。我認爲你的方法會適合這種特殊情況嗎? – Joe

2

這是正則表達式的另一種可能的應用。

static Regex isAlpha = new Regex("^[A-Za-z]+$"); 
static Regex isAlphaNumeric = new Regex("^[A-Za-z0-9]+$"); 

static FieldKind AnalyzeKind (string s) 
{ 
    if(isAlpha.IsMatch(s)) return FieldKind.Alpha; 
    if(isAlphaNumeric.IsMatch(s)) return FieldKind.AlphaNumeric; 
    return FieldKind.AlphaNumericWithSpecialCharacters; 
} 

如果你將要調用AnalyseKind很多程序,你可以通過在正則表達式的構造函數設置RegexOptions.Compiled加快它一點點。

+0

是的,可能是比我更清潔的解決方案。 –

+0

這肯定是正則表達式的合適用法。好方法! –

+0

根據「」計爲Alpha,AlphaNumeric還是什麼,您可能需要將正則表達式中的一個或多個「+」字符更改爲「*」(即匹配0或更多,而不是匹配1或更多) 。 –

相關問題