0

以下の列挙型を検討してください。

public enum TestType
{
    Mil,
    IEEE
}

次の文字列を上記の列挙型に解析するにはどうすればよいですか?

Military 888d TestTestType.Mil または IEEE 1394の場合TestType.IEEE

私の考えは、文字列の最初の文字が「Mil」または「IEEE」と一致するかどうかを確認し、それを必要な列挙型として設定することでしたが、問題は、解析してはならない他のケースがあることです。

4

6 に答える 6

2

すでに私が答えた:列挙型C#で文字列を設定する方法は?

列挙型を文字列にすることはできませんが、属性を付加することはできます。列挙型の値を以下のように読み取ることができます...................。

public enum TestType
{
      [Description("Military 888d Test")]
     Mil,
      [Description("IEEE 1394")]
     IEEE
 }



public static string GetEnumDescription(Enum value)
{
    FieldInfo fi = value.GetType().GetField(value.ToString());

    DescriptionAttribute[] attributes =
        (DescriptionAttribute[])fi.GetCustomAttributes(
        typeof(DescriptionAttribute),
        false);

    if (attributes != null &&
        attributes.Length > 0)
        return attributes[0].Description;
    else
        return value.ToString();
}

あなたがそれを通り抜けたいのであれば、ここに良い記事があります:C#での文字列と列挙型の関連付け

于 2012-07-16T10:00:31.027 に答える
1

あなたの状況についての私の理解は、文字列は任意の形式で来ることができるということです。「Military888dTest」、「Mil 1234 Test」、「MilitxyzSOmething」などの文字列を使用できます。

このようなシナリオでは、単純なEnum.Parseは役に立ちません。列挙型の値ごとに、どの組み合わせを許可するかを決定する必要があります。以下のコードを検討してください...

public enum TestType
{
    Unknown,
    Mil,
    IEEE
}

class TestEnumParseRule
{
    public string[] AllowedPatterns { get; set; }
    public TestType Result { get; set; }
}


private static TestType GetEnumType(string test, List<TestEnumParseRule> rules)
{
    var result = TestType.Unknown;
    var any = rules.FirstOrDefault((x => x.AllowedPatterns.Any(y => System.Text.RegularExpressions.Regex.IsMatch(test, y))));
    if (any != null)
        result = any.Result;

    return result;
}


var objects = new List<TestEnumParseRule>
                  {
                      new TestEnumParseRule() {AllowedPatterns = new[] {"^Military \\d{3}\\w{1} [Test|Test2]+$"}, Result = TestType.Mil},
                      new TestEnumParseRule() {AllowedPatterns = new[] {"^IEEE \\d{3}\\w{1} [Test|Test2]+$"}, Result = TestType.IEEE}
                  };
var testString1 = "Military 888d Test";
var testString2 = "Miltiary 833d Spiral";

var result = GetEnumType(testString1, objects);
Console.WriteLine(result); // Mil

result = GetEnumType(testString2, objects);
Console.WriteLine(result); // Unknown

重要なことは、そのルールオブジェクトに関連する正規表現またはテストを入力することです。これらの値を配列に取り込む方法は、実際にはあなた次第です...

于 2012-07-16T10:15:46.777 に答える
0

簡単な方法でそれができます:

public TestType GetTestType(string testTypeName)
{
   switch(testTypeName)
   {
       case "Military 888d Test":
           return TestType.Mil;
       case "IEEE 1394":
           return TestType.IEEE;
       default:
           throw new ArgumentException("testTypeName");
   }
}
于 2012-07-16T10:08:04.897 に答える
0

これを試してvar result = Enum.Parse(type, value);

于 2012-07-16T09:57:34.907 に答える
0

編集

使用Enum.GetNames

foreach (var value in Enum.GetNames(typeof(TestType))) 
{
    // compare strings here
    if(yourString.Contains(value))
    {
        // what you want to do
        ...
    }
}

.NET4以降を使用している場合は、を使用できますEnum.TryParseEnum.Parse.NET2以降で使用できます。

于 2012-07-16T10:01:15.497 に答える
0

このようにしてみてください

    TestType testType;
    Enum.TryParse<TestType>("IEEE", out testType);

そしてそれはあなたが文字列を比較したい

bool result = testType.ToString() == "IEEE";
于 2012-07-16T10:02:20.497 に答える