web-dev-qa-db-ja.com

Enumで文字列を検索し、Enumを返します

列挙があります:

public enum MyColours
{
    Red,
    Green,
    Blue,
    Yellow,
    Fuchsia,
    Aqua,
    Orange
}

私は文字列を持っています:

string colour = "Red";

返品できるようにしたい:

MyColours.Red

から:

public MyColours GetColour(string colour)

これまでのところ:

public MyColours GetColours(string colour)
{
    string[] colours = Enum.GetNames(typeof(MyColours));
    int[]    values  = Enum.GetValues(typeof(MyColours));
    int i;
    for(int i = 0; i < colours.Length; i++)
    {
        if(colour.Equals(colours[i], StringComparison.Ordinal)
            break;
    }
    int value = values[i];
    // I know all the information about the matched enumeration
    // but how do i convert this information into returning a
    // MyColour enumeration?
}

あなたが見ることができるように、私は少し立ち往生しています。とにかく値で列挙子を選択することはできますか。何かのようなもの:

MyColour(2) 

結果として

MyColour.Green
145
Matt Clarkson

system.Enum.Parseをチェックアウトします。


enum Colors {Red, Green, Blue}

// your code:
Colors color = (Colors)System.Enum.Parse(typeof(Colors), "Green");
350
JMarsch

Intを列挙型にキャストできます

(MyColour)2

Enum.Parseのオプションもあります

(MyColour)Enum.Parse(typeof(MyColour), "Red")
18
Guvante

.NET(+ Core)およびC#7に対する最新かつ最大の変更を考えると、最良のソリューションは次のとおりです。

var ignoreCase = true;
Enum.TryParse("red", ignoreCase , out MyColours colour);

色変数は、Enum.TryParseのスコープ内で使用できます

10
Roman

必要なのは Enum.Parse だけです。

5
Bruno Brant

OregonGhostの答えに+1をマークし、繰り返しを使用しようとしましたが、Enum.GetNamesが文字列を返すため、それが正しくないことに気付きました。 Enum.GetValuesが必要です:

public MyColours GetColours(string colour)
{  
   foreach (MyColours mc in Enum.GetValues(typeof(MyColours))) 
   if (mc.ToString() == surveySystem) 
      return mc;

   return MyColors.Default;
}
2
Colin

Enum.Parseを使用して、名前から列挙値を取得できます。 Enum.GetNamesを使用してすべての値を反復処理できます。また、intを列挙型にキャストして、int型の値から列挙型の値を取得できます。

このように、例えば:

public MyColours GetColours(string colour)
{
    foreach (MyColours mc in Enum.GetNames(typeof(MyColours))) {
        if (mc.ToString().Contains(colour)) {
            return mc;
        }
    }
    return MyColours.Red; // Default value
}

または:

public MyColours GetColours(string colour)
{
    return (MyColours)Enum.Parse(typeof(MyColours), colour, true); // true = ignoreCase
}

値が見つからない場合、後者はArgumentExceptionをスローします。関数内でそれをキャッチし、デフォルト値を返すことができます。

1
OregonGhost
(MyColours)Enum.Parse(typeof(MyColours), "red", true); // MyColours.Red
(int)((MyColours)Enum.Parse(typeof(MyColours), "red", true)); // 0
0

あなたに役立つかもしれないことの1つは(これまでに提供されたすでに有効/良い答えに加えて)StringEnumのアイデアが提供されていることです here

これにより、列挙をクラスとして定義できます(例はvb.netにあります)。

<StringEnumRegisteredOnly()、DebuggerStepThrough()、ImmutableObject(True)> Public NotInheritable Class eAuthenticationMethod Inherits StringEnumBase(Of eAuthenticationMethod)

Private Sub New(ByVal StrValue As String)
  MyBase.New(StrValue)   
End Sub

< Description("Use User Password Authentication")> Public Shared ReadOnly UsernamePassword As New eAuthenticationMethod("UP")   

< Description("Use Windows Authentication")> Public Shared ReadOnly WindowsAuthentication As New eAuthenticationMethod("W")   

終了クラス

そして今、あなたは列挙を使用するようにこのクラスを使用することができます:eAuthenticationMethod.WindowsAuthenticationそしてこれは基本的に 'W'を割り当てるようなものですWindowsAuthentication(enum内)の論理値、およびプロパティウィンドウ(またはSystem.ComponentModelを使用する他の何か)からこの値を表示する場合。説明プロパティ)「Windows認証を使用」を取得します。

私はこれを長い間使用しており、意図的にコードをより明確にします。

0
Ando
var color =  Enum.Parse<Colors>("Green");
0
pampi

また、このブログ投稿のいくつかの提案を確認することもできます。 私の新しい小さな友人、Enum <T>

投稿では、Enum.Parseに固有のいキャスト構文を回避できる非常に単純な汎用ヘルパークラスを作成する方法について説明します。

MyColours colour = Enum<MyColours>.Parse(stringValue); 

または、同じ投稿で、拡張メソッドを使用して同様のことを達成することについて説明しているコメントの一部をチェックしてください。

0
Julian Martin

前の回答で述べたように、基になるデータ型(int->列挙型)または解析(文字列->列挙型)に直接キャストできます。

しかし、注意してください-列挙型には.TryParseがないため、失敗をキャッチするために解析の周りにtry/catchブロックが必要になります。

0
Addys
class EnumStringToInt // to search for a string in enum
{
    enum Numbers{one,two,hree};
    static void Main()
    {
        Numbers num = Numbers.one; // converting enum to string
        string str = num.ToString();
        //Console.WriteLine(str);
        string str1 = "four";
        string[] getnames = (string[])Enum.GetNames(typeof(Numbers));
        int[] getnum = (int[])Enum.GetValues(typeof(Numbers));
        try
        {
            for (int i = 0; i <= getnum.Length; i++)
            {
                if (str1.Equals(getnames[i]))
                {
                    Numbers num1 = (Numbers)Enum.Parse(typeof(Numbers), str1);
                    Console.WriteLine("string found:{0}", num1);
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("Value not found!", ex);
        }
    }
}
0
Raja