2011-01-27 22 views
3

私のdbに格納する列挙型の値のリストを単一の文字列に変換する必要があります。私はデータベースから取得するときに再び変換します。C#列挙型を文字列に変換して元に戻す簡単な方法はありますか?

現在のところ、各列挙型の値は単純な整数なので、これに対処するために余分なテーブルを作成するのはちょっと残念です。

ユーザーは母、父と姉を選択したのであれば、以下の例では、その後、データベースに格納されている値が「0,1,3」

public enum MyEnum 
    { 
     Mother = 0, 
     Father = 1, 
     Gran = 2, 
     Sister = 3, 
     Brother = 4 
    } 

になります私はC#に新たなんです確かにこれを行うための素敵なアウトボックスの方法があるかどうかわからない - 私はGoogleの狩猟時に何も明らかに見つけることができませんでした!事前に

乾杯:) - L

答えて

3

以下は」を介して列挙型の値の配列の間で前後に変換されます0,1,3 "要求:

MyEnum[] selection = { MyEnum.Mother, MyEnum.Father, MyEnum.Sister }; 

string str = string.Join(",", selection.Cast<int>()); 

MyEnum[] enm = str.Split(',').Select(s => int.Parse(s)).Cast<MyEnum>().ToArray(); 
+0

おかげで、これは私が探していたものです! – laura

3

戻ったばかりの変換するには(あなたは、.NET 4にはいないのであればまたはEnum.Parse)名、および使用Enum.TryParseに変換しToStringを使用しています。

1つの列挙型フィールドに複数の値(たとえばMyEnum.Mother | MyEnum.Father)を含める場合は、Flags enumに変換する必要があります(@WraithNath suggested)。それ以外の場合は、各オプションを別々に保存することをお勧めします(現在の設定で同じフィールドにMotherFatherを保存する方法はありません)。

8

列挙型の明示的に文字列の

int value = (int)MyEnum.Mother; 

MyEnum value = (MyEnum)1; 

整数へ/からキャストされることが可能であるがToStringEnum.Parse

string value = MyEnum.Mother.ToString(); 

を使用しますあなたのコードから
+1

これらは、' string'が要求したとおりのものではありません。 –

+0

@Fredrikしかし、彼はまた、文字列に変換する方法を述べていますか? –

+0

@Oskar:コメントを投稿したときにその部分はなかったと思う。いずれにせよ、私は実際に質問を少し誤解したと思う。これはそれがかなり要求されたもののように見えます。 –

2

それはあなたがあなたの列挙型の値を変更した場合

MyEnum a = MyEnum.Mother; 
string thestring = a.ToString(); 
MyEnum b = (MyEnum) Enum.Parse(typeof(MyEnum), thestring); 
4

です:

[Flags] 
public enum MyEnum 
    { 
     Mother = 1, 
     Father = 2, 
     Gran = 4, 
     Sister = 8, 
     Brother = 16, 
    } 

次にあなたが24などとして6

姉妹と兄弟のように父とグランを保存することができ

バイナリ番号を使用すると、重複する値を取得することは避けてください。

+1

+1試行錯誤したアプローチです。 – Joe

+3

+1。この列挙は[Flags] –

+1

とマークする必要がありますが、私はあなたと同じ時間に姉妹&兄弟になる方法に興味があります。 – Jamiec

1

ストリングEquivelant

MyEnum value = MyEnum.Father; 
value.ToString(); // prints Father 

sは整数値へとからキャストすることができる

(MyEnum)Enum.Parse(typeof(MyEnum), "Father"); // returns MyEnum.Father 
+0

+1 Enum.Parseを忘れてしまった – Crisfole

+0

LOL:それが起こると大好きです。お互いの答えに同じコメント。 – Crisfole

0

Enumの解析。それはおそらくあなたの最善の策です。

実際に文字列を使用する場合は、ToStringが「母」「父」「グラン」などを返します。バック文字列からキャストするだけの機能のようになります。

private MyEnum GetEnumValue(string fromDB) 
{ 
    if(fromDB == "Mother") return MyEnum.Mother; 
    else if(fromDB == "Father") return MyEnum.Father; 
    //etc. etc. 
} 

EDIT:バックキャスティングのための イアンの答えはそれをやって、より「C#-ey」方法であり、はるかに拡張可能である(ハンドルに新しい値を追加します列挙型ははるかに柔軟に)。さらに

+2

Enum.Parse() – Ian

0

あなたは守備あなたの鋳造をコーディングする必要がある場合は(あなたの必要性のためによく合う)Jamiecの提案に、試してみてください。

if (Enum.IsDefined(typeof(MyEnum), <your database value>)) 
{ 
    // Safe to convert your enumeration at this point: 
    MyEnum value = (MyEnum)1; 
} 
関連する問題