2011-08-04 4 views
1

良いアルゴリズムを構築するにはいくつかの問題があります。私の基準は次のとおりです。xmlファイル内のフィールドを文字列として読み込み、GUIコンポーネントをアクティブにするために解釈しようとしています。より具体的には、文字列として読み込まれるフィールドは「許可される文字」フィールドであり、GUIコンポーネントはフィールドの内容に基づいてアクティブになるチェックボックスです。例えば、XMLに私は文字列としてこのフィールドに読んだとき、プログラムは、フィールドのコンテンツタイプがALPHAであるとタグフィールドタイプを解釈してCのチェックボックスを有効にする

<Allowed Field>ABCDEFGHIJKLMNOPQRSTUVWXYZ</Allowed Fields>. 

を知っている必要がありますし、アルファという名前のチェックボックスにチェックを入れてきました。フィールドに英数字の内容または特殊文字が含まれている場合も同様です。アルゴリズムには、アルファ、英数字、特殊文字の3つのチェックボックスがあります。上記のフィールド型を意味するようにxmlから読み込んだ文字列の意味を解釈するアルゴリズムをどのように構築できますか?

おかげ

+1

私はちょうどstring.containsを試しました。たとえば、1つのif文がAを持っていることを確認してalphaを考慮に入れ、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文の後で改行しません。文字が数字の場合、2番目のif文の文字ではないことをtrueに戻し、その後SpecialCharactersで戻ります。あなたはあなたの最初の場合には休憩が必要か、もしあればもう一度、もしあれば。 –

+0

@Gweebz:これを見つけてくれてありがとう。私の間違い。私はまだ「特殊文字」かもしれないし、OPがこの「特殊性」を明確に定義していないので、すぐにテストすることができないので、「中断」したくない。 –

+0

特殊文字は、基本的にa-zと0-9以外のキーボード上のものです。私はあなたの方法がこの特殊性のためにうまくいくと思いますか? – Joe

2

これはRegexの別の可能なアプリケーションです。あなたがプログラムで多くのことをAnalyseKind呼び出ししようとしている場合は

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; 
} 

、あなたは正規表現コンストラクタにRegexOptions.Compiledを設定することで、少しそれをスピードアップすることができます。

+0

ええ、おそらくもっと賢明な解決策です。 –

+0

これは間違いなくRegexの適切な使用になります。ニースの方法! –

+0

Alpha、AlphaNumeric、または何でカウントするかによって、正規表現内の "+"文字のうちの1つ以上を "*"に変更する(つまり、1以上にマッチする代わりに0以上にマッチさせる) 。 –

関連する問題