2012-03-01 21 views
1

私はテキストプロジェクトの解析に取り組んでいます。ここでは、一致するテキストをテキストから取得し、それに応じていくつかのアクションを実行する必要があります。文字列値で列挙型のオブジェクトを作成するにはどうすればよいですか?

今、私はテキストを一致させるためにenumを使用しようとしています。すべての条件、すべての条件、なし、アルテスト1、などなどです。キーワードが後で変更される可能性があるためenumを使用しようとしています 列挙値に文字列値を格納することは可能ですか?

public enum condition 
{ 
    type1 = "all the conditions", 
    type2 = "any of the conditions" 
} 

私はいずれかの助け

答えて

4

あなたは読み取り専用文字列プロパティを使用することができますすることができ、それは通常の列挙型の使用状況のようではありません知っている:

if(condition_variable == Condition.Type1)//will do a string compare here. 
{ 
... 
} 

public class Condition 
{ 
    public static readonly string Type1 = "All_The_Conditions"; 
    public static readonly string Type2 = "Any_Conditions"; 
} 

はこのようにそれを使用します

BUT

しかし、上記の解決策はswitchステートメントでは機能しません。

switch (condition_variable) 
{ 
    case Condition.Type1://can only be done with const 
    .... 
    break; 
} 

enums (See MSDN)に展開するにはthis post for static readonly vs const variables.


を参照してください:

彼らがデフォルトを持っているあなたはconst

public class Condition 
{//this could be a better solution.. 
    public const string Type1 = "All_The_Conditions"; 
    public const string Type2 = "Any_Conditions"; 
} 

を使用することができ、その場合にはあなたはこのようにそれを使用することができます基本タイプはintです。あなたは、次の整数型のいずれかに基本となるタイプを変更することができます:私は私の答えを改善するための手助け@BryanへとR0MANARMY @byte, sbyte, short, ushort, int, uint, long, or ulong.


感謝を。

+0

+1列挙型は定義によって数値型なので、文字列はサポートされません。この解決法を 'switch'ステートメントで使うことはできないことに言及する価値があります。 –

+0

@BryanWatts優れたキャッチ。 R0MANARMYうまく同じ行を考えていたと質問を更新しました:) – gideon

+0

@ R0MANARMYああタイプミス、私はコピーし、前のコードブロックを貼り付け、それを修正しました。 (私は現時点で開いているプロジェクトでこのようなものを使用しました;) – gideon

3

代わりに辞書を使用して、列挙型(キー)から文字列(値)にマッピングできます。以下のような 何か:

Dictionary<Condition, string> dict = new Dictionary<Condition, string>(); 
dict[Condition.Type1] = "all the conditions"; 

[編集]:実は、今、私はもっと慎重にあなたの質問を読んでいることを、私はそれを他の方法で回避をするでしょう。マッピングは文字列から条件にする必要がありますし、テキストをキー値(文字列)と比較し、一致する場合は列挙値を取得する必要があります。すなわち:

Dictionary<string, Condition> dict = new Dictionary<string, Condition>(); 
    Condition result = Condition.Invalid; 

    bool isFound = dict.TryGetValue(someTextToParse, out result); 

意味がありますか?

+0

実行時の例外を避けるためにキーが辞書に含まれているかどうかを調べる必要があります。それはコードの意図をあいまいにすることに役立つかもしれません。 – R0MANARMY

+0

はい、OPでテキストを解析する必要がある場合は、文字列(またはそのハッシュ)をキーとして使用してください。列挙型キーは、例えば、 TryGetValue http://msdn.microsoft.com/en-us/library/bb347013.aspx – StuartLC

+0

nonnb - 同意...私は私の答えを編集しました... –

0

enumの定義に数値が含まれていたという印象を受けましたが、私は間違っている可能性があります。

これを処理する別の方法は、structオブジェクトの単純な配列である:これは可能性を秘めている。もちろん

enum ConditionValues 
{ 
    type1 = 1; 
} 

struct ConditionKeywords 
{ 
    int Key; 
    string Value; 
} 
ConditionKeywords[] keyword = { new ConditionKeywords { Key = 1, Value = "all the conditions } /* ... */ }; 

、コードにアクセスすることができ、単純な列挙ダブル・エッジの剣である同じキーを意味する複数のストリングを持つため、より簡単なアプローチは次のようになります。

string[] ConditionKeywords { "all the conditions" /* ... */ } 

上記の同じ列挙方法を使用します(ConditionKeywordsの有効なインデックスのみに限定します)。

+0

うわー、私は私の答えを入力する間に多くの逃した。 –

+0

私は感情を知っている! (他のほとんどの質問から) – gideon

関連する問題