在C#中的if语句中测试多个值
C#中是否有简写语法来实现:
if ((x == 1) || (x==2) || (x==5) || (x==13) || (x==14))
……更短? 像(假设)的东西
if (x in {1, 2, 5, 13, 14})
我“感觉”它就像它存在一样,我只是在精神上和Googly。 实际上,我必须经常测试一堆枚举,这是不可读的。 如果语言已经支持,我也讨厌做一个小帮手function。
提前致谢!
编辑
有一些聪明的解决方案涉及列表…但我希望有一种纯粹的逻辑结构。 如果它不存在,那就这样吧。 谢谢!
试试这个:
if ((new[]{1, 2, 5, 13, 14}).Contains(x)) ...
虽然我认为if语句很好,并且为了简洁而使代码简洁是没用的,这里有:
第一种方法,假设您想要进入LINQ路线:
if ((new[]{1,2,5,13,14}).Contains(x)){ }
第二种方法,ArrayList
if ((new System.Collections.ArrayList(new[]{1,2,5,13,14})).Contains(x)){ }
第三种方法,列表:
if ((new System.Collections.Generic.List(new[]{1,2,5,13,14})).Contains(x)){ }
但请记住, 所有这些都会增加更多开销(考虑到性能考虑,实际上并没有增加太多可读性)。
哦,以及上面的工作实例 。
我想建议使用HashSet(T)类来检查元素是否属于元素集。
此外,由于HashSet
是一个关联容器,其查找复杂度为O(1),即常量时间: HashSet(Of T).Contains方法 ,而Array
和List
具有线性时间查找:O(n) 。 因此, HashSet
对于查找会更好。
HashSet numbers = new HashSet { 1, 2, 5, 13, 14 }; int x = 1; if (numbers.Contains(x)) { Console.WriteLine("Contains!"); }
不,没有像这样直接比较的支持。 但是,您可以使用LINQ方法,例如Contains()。 我可以提供一个示例,但它取决于数据项最初的存储方式。
你也许可以这样做:
if( Array.LastIndexOf(new int[]{1, 2,3,4}, x) != -1) { //YOUR CODE HERE }
未经测试,但我相信这会奏效。
编辑看起来已经发布了类似的回复。