我有一个这样的枚举:
public enum Animals
{
CatOne = 12,
CatTwo = 13,
CatThree = 14,
DogOne = 21,
DogTwo = 22
};
大
现在我想得到所有猫的价值。我想做的是:
public static int[] GetCatValues()
{
List<int> catValues = new List<int>();
foreach(var cat in Enum.GetNames(typeof(Animals)))
{
Animals animal;
if(cat.StartsWith("Cat"))
{
Enum.TryParse(cat, out animal);
catValues.Add((int)animal);
}
}
return catValues.ToArray();
}
哪个有效。除了它看起来很难看。为什么我不能做像
这样的事情Animals
.Select(r => (int)r)
.Where(r => r.StartsWith("Cat"))
.ToArray();
我知道这不起作用。那么是否有更好的方法来获取以某些字符串开头的枚举的所有值。
我知道我可以使用正则表达式来避免误报,但是,我现在保持简单。
感谢。
答案 0 :(得分:14)
最简单的方法就是使用ToString
获取名称:
return ((Animals[]) Enum.GetValues(typeof(Animals)))
.Where(r => r.ToString().StartsWith("Cat"))
.Select(r => (int) r) // Assuming you want this
.ToArray();
或使用Cast<>
来避免转换为Animals[]
:
return Enum.GetValues(typeof(Animals))
.Cast<Animals>()
.Where(r => r.ToString().StartsWith("Cat"))
.Select(r => (int) r) // Assuming you want this
.ToArray();
(我更喜欢Cast<>
到OfType<>
,因为我们 希望每个值都为Animals
- 如果不是,则完全例外适当!)
然而,这一切对我来说都有点蠢 - 对枚举值的名称的任何重要性总是感觉有点毛茸茸,并且解析名称的特定位更是如此。您可能希望尝试使用属性装饰每个值以指定“组”。
我还建议调用枚举Animal
而不是Animals
- 只有基于标志的枚举通常应该是复数,而“Animals
值的集合”听起来非常奇怪。
(另外,您可能希望查看我的Unconstrained Melody项目,该项目允许对枚举进行类型安全,高效的通用访问,通过IL中合法但不能用C#表示的通用约束。 。)
答案 1 :(得分:11)
这是一套妥协的代码 - 它不像你想要的那样干净,但它比foreach循环版本要好得多。
Enum.GetValues(typeof(Animals)).OfType<Animals>()
.Where(x => x.ToString().StartsWith("Cat"))
.Select(x => (int)x).ToArray();
答案 2 :(得分:2)
更好的方法是使用标志。
[Flags]
public enum Animals
{
CatOne = 1,
CatTwo = 2,
CatThree = 4,
DogOne = 8,
DogTwo = 16,
AllCats = Animals.CatOne | Animals.CatTwo | Animals.CatThree,
AllDogs = Animals.DogOne | Animals.DogTwo
};
当然,只有当你能够重新编号你的枚举,并且不知道你需要对这些值做什么时,这很有用,很难说它是否适合你。
答案 3 :(得分:1)
有点难看,但可能适合你的情况:
在这种情况下,猫将是实际的枚举,而不是整数。
var cats = Enum.GetNames(typeof(Animals))
.Where (e => e.StartsWith("Cat"))
.Select (e => Enum.Parse(typeof(Animals), e));