匹配数组中的整数
Match an integer in an array
我有以下整数,我想用 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");
}
问题是:
是否有一个运算符可以满足我想要完成的任务,而无需声明额外的数组或使用 || 反复请求相同的变量名运算符?
看,我在想...为什么不使用开关?
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;
}
您可以使用 switch-case,但有人会说这看起来很乱。
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
你的问题是
是否有一个运算符可以满足我想要完成的任务而无需声明额外的数组
但确实应该
是否有一个运算符可以满足我想要完成的任务,而无需每次都声明一个额外的数组
拥有该数组一次(并初始化一次)并没有错,但是每次都分配它(并通过扩展GCing)有很多错误。所以你需要声明一个数组一次,比如
private static int matchArray[] = new int[] { 0, 2, 3, 4 };
以后只是
if (matchArray.Contains(myInt)) ...
编辑
如果您的匹配数组很小,无论如何请使用 @JohnField 的答案,而不是这个 - 我同意!
如果您的数组是有序的,Array.BinarySearch 将比 Contains 更有效,尤其是当数组包含多个元素时。
if (Array.BinarySearch(checkArray, myInt) >= 0)
;//match
else
;//no match
然而,通常,Contains
操作的最佳选择是 HashSet。感谢 JohanLarsson 指出这一点。
可能有一种方法可以实现你想做的事情。它们被称为枚举标志。 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))
{
...
}
显然这种方法更优雅,只要你需要检查少量情况。如果您要检查的数组很大,那将不是合适的方法。
我有以下整数,我想用 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");
}
问题是:
是否有一个运算符可以满足我想要完成的任务,而无需声明额外的数组或使用 || 反复请求相同的变量名运算符?
看,我在想...为什么不使用开关?
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;
}
您可以使用 switch-case,但有人会说这看起来很乱。
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
你的问题是
是否有一个运算符可以满足我想要完成的任务而无需声明额外的数组
但确实应该
是否有一个运算符可以满足我想要完成的任务,而无需每次都声明一个额外的数组
拥有该数组一次(并初始化一次)并没有错,但是每次都分配它(并通过扩展GCing)有很多错误。所以你需要声明一个数组一次,比如
private static int matchArray[] = new int[] { 0, 2, 3, 4 };
以后只是
if (matchArray.Contains(myInt)) ...
编辑
如果您的匹配数组很小,无论如何请使用 @JohnField 的答案,而不是这个 - 我同意!
如果您的数组是有序的,Array.BinarySearch 将比 Contains 更有效,尤其是当数组包含多个元素时。
if (Array.BinarySearch(checkArray, myInt) >= 0)
;//match
else
;//no match
然而,通常,Contains
操作的最佳选择是 HashSet。感谢 JohanLarsson 指出这一点。
可能有一种方法可以实现你想做的事情。它们被称为枚举标志。 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))
{
...
}
显然这种方法更优雅,只要你需要检查少量情况。如果您要检查的数组很大,那将不是合适的方法。