考虑下面的枚举:
public enum TestType
{
Mil,
IEEE
}
如何将以下字符串解析为上述枚举?
Military 888d Test
如果是TestType.Mil
或者
IEEE 1394
如果是TestType.IEEE
我的想法是检查字符串的第一个字母是否匹配 'Mil' 或 'IEEE' 然后我将其设置为我想要的枚举,但问题是还有其他不应该解析的情况!
我已经回答了:如何在 Enum 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();
}
如果您想仔细阅读,这是一篇好文章:Associating Strings with enums in C#
我对您的情况的理解是字符串可以采用任何格式。您可以使用诸如“Military 888d Test”、“Mil 1234 Test”、“Milit xyz SOthing”之类的字符串...
在这种情况下,简单的 Enum.Parse 不会有帮助。您需要为 Enum 的每个值决定您希望允许哪些组合。考虑下面的代码......
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
重要的是用相关的正则表达式或测试填充规则对象。你如何将这些值放入数组中,真的取决于你......
尝试这个var result = Enum.Parse(type, value);
编辑
foreach (var value in Enum.GetNames(typeof(TestType)))
{
// compare strings here
if(yourString.Contains(value))
{
// what you want to do
...
}
}
如果您使用 .NET4 或更高版本,则可以使用Enum.TryParse
. 并且Enum.Parse
适用于 .NET2 及更高版本。
请尝试这种方式
TestType testType;
Enum.TryParse<TestType>("IEEE", out testType);
然后你想比较字符串
bool result = testType.ToString() == "IEEE";
简单的方法将为您完成:
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");
}
}