我有以下整数,我想用if语句检查该值。
int myInt = 3;
我尝试了这个有效的代码,但我不喜欢一遍又一遍地写变量名。
if (myInt == 0 || myInt == 2 || myInt == 3 || myInt == 4)
{
Debug.WriteLine("Match");
}
else
{
Debug.WriteLine("No Match");
}
为了展示我想要的东西,我尝试过这样的事情:
if (myInt == (0 | 2 | 3 | 4))
{
Debug.WriteLine("Match");
}
else
{
Debug.WriteLine("No Match");
}
但这不起作用,因为|因为存在类型不匹配而不是正确的运算符。
然后我尝试了这个,这也很好,但我仍然不喜欢声明一个额外的数组。
if ((new int[] { 0, 2, 3, 4 }).Contains(myInt))
{
Debug.WriteLine("Match");
}
else
{
Debug.WriteLine("No Match");
}
问题是:
是否有一个运算符可以满足我正在尝试完成的任务而无需声明一个额外的数组或一遍又一遍地询问相同的变量名称操作
答案 0 :(得分:6)
你的问题是
是否有一个运算符可以满足我想要完成的任务而不需要声明一个额外的数组
但它确实应该
是否有一个运营商可以满足我想要完成的目标,而不会每次都声明一个额外的阵列
拥有该数组一次(并初始化一次)没有任何问题,但是每次分配它(并通过扩展GCing它)都有很多错误。所以你需要声明一次数组,比如
private static int matchArray[] = new int[] { 0, 2, 3, 4 };
以后只是
if (matchArray.Contains(myInt)) ...
修改强>
如果你的匹配阵列很小,无论如何都要使用 @JohnField 的答案,而不是这个 - 我的立场得到了纠正!
答案 1 :(得分:3)
可能有办法实现您想要做的事情。它们被称为枚举标志。 Here有一个很好的答案可以解释它们的工作原理。
他们想要使用整数让我想起你可能有多种选择的枚举。我们以下列情况为例:
[Flags]
enum DaysOfTheWeek
{
Sunday = 1,
Monday = 2,
Tuesday = 4,
Wednesday = 8,
Thursday = 16,
Friday = 32,
Saturday = 64
}
你可以声明一个变量如下:
DaysOfTheWeek daysOfTheWeek;
daysOfTheWeek = DaysOfTheWeek.Monday | DaysOfTheWeek.Wednesday | DaysOfTheWeek.Friday;
然后检查您的枚举是否包含上面指定的值之一:
if((daysOfTheWeek & DaysOfTheWeek.Monday) == DaysOfTheWeek.Monday)
{
// Contains Monday!
}
else
{
// DOES NOT Contain Monday!
}
或从.NET 4开始:
if(daysOfTheWeek.HasFlag(DaysOfTheWeek.Monday))
{
...
}
显然,只要您需要检查少量案例,此方法就更加优雅。如果您要检查大阵列,那么这将不适合。
答案 2 :(得分:2)
看,我只是想......为什么不使用开关?
https://msdn.microsoft.com/en-us/library/06tc147t.aspx
int myInt = 3;
switch (myInt)
{
case 0:
case 2:
case 3:
case 4:
// Match
break;
default:
// No match
break;
}
答案 3 :(得分:1)
如果你的数组是有序的,Array.BinarySearch将比Contains更有效,特别是如果数组有多个元素。
if (Array.BinarySearch(checkArray, myInt) >= 0)
;//match
else
;//no match
然而,通常,Contains
操作的最佳选择是HashSet。感谢JohanLarsson指出这一点。
答案 4 :(得分:0)
你可以使用一个开关盒,但可以说这看起来很混乱。
switch (myInt)
{
case 0: //Add a comment to make it clear that
case 2: //this is a deliberate fall-through and
case 3: //not a mistake. (E.g. "//Deliberate
case 4: //fall-through for 0, 2, 3, 4")
//Insert code here in this section to do something
Debug.WriteLine("Match");
break; //Break statement is required to indicate end of section
default:
//The default section runs like an "else" statement
//It is optional and will run if none of the above
//cases are applicable.
Debug.WriteLine("No Match");
break;
} //end switch-case