在C#中如果我想看一个变量是否等于一组固定值中的一个,我现在就这样做......
bool result = ( (x==MyEnum.A) || (x==MyEnum.B) || (x==42) );
......对我来说很麻烦。有没有类似于这个伪代码的东西?
bool result = x in {MyEnum.A, MyEnum.B, 42};
我知道我可以使用值内联创建一个数组,然后使用LINQ,但还有其他选项吗?
答案 0 :(得分:3)
使用LINQ,您可以使用Contains
撤消此操作(测试x
是否在列表中):
var myList = new[] {MyEnum.A, MyEnum.B, (MyEnum)42};
result = myList.Contains(x);
答案 1 :(得分:3)
这可能是一个不好的想法,但是您可以将Contains转到其头部并使用新的扩展方法获得与您在问题中提出的语法类似的语法:
//Generic. All items in the set and the candidate must be the same type.
public static bool In<T>(this T item, params T [] set)
{
return set.Contains(item);
}
bool result = x.In(MyEnum.A, MyEnum.B, MyEnum.C);
//Non-generic and non-typesafe. Anything goes. Use with care!
public static bool In(this object item, params object [] set)
{
return set.Contains(item);
}
bool result = x.In(MyEnum.A, MyEnum.B, 42);
//int-specific.
public static bool In(this int item, params int [] set)
{
return set.Contains(item);
}
bool result = x.In((int)MyEnum.A, (int)MyEnum.B, 42);
答案 2 :(得分:1)
var result = new[] { (int)MyEnum.A, (int)MyEnum.B, 42 }.Contains(x);
甚至更好:
创建扩展方法:
public static bool ContainedIn(this MyEnum input, params MyEnum[] parameters)
{
return parameters.Contains(input);
}
var result = x.ContainedIn(MyEnum.A, MyEnum.B)
;
如果你想允许多种类型,你可以使用对象作为参数类型
答案 3 :(得分:0)
您可以利用Enumerable.Contains()扩展方法,该方法适用于所有IEnumerable类型:
public static bool Contains<TSource>(this IEnumerable<TSource> source, TSource value);
语法仍然有点难看,但你可以接近你想要的东西:
public enum MyEnum
{
A, B, C
}
public static void Test()
{
MyEnum x = MyEnum.C;
bool result = new[] { MyEnum.A, MyEnum.B, (MyEnum)42 }.Contains(x);
}
答案 4 :(得分:0)
如果您的列表太长,但您在枚举定义中订购了您要查找的值,则可以创建一个范围并在其上调用Contains(),如下所示:
bool result = Enumerable.Range((int)MyEnum.First,(int)MyEnum.Last)
.Contains((int)x);
这将在上述条件下派上用场,但我想发布此内容,因为您不想创建内联数组。