确定变量是否等于"值列表"中的值的最简洁方法
如果我在C中有一个变量需要检查以确定它是否等于一组变量之一,那么执行此操作的最佳方法是什么?
我不是在寻找一种将集合存储在数组中的解决方案。我更想知道是否有一种以某种方式使用布尔逻辑的解决方案来获得答案。
我知道我可以做这样的事情:
int baseCase = 5; bool testResult = baseCase == 3 || baseCase == 7 || baseCase == 12 || baseCase == 5;
我很好奇我是否可以做更多这样的事情:
int baseCase = 5; bool testResult = baseCase == (3 | 7 | 12 | 5);
显然上述方法不起作用,但是我有兴趣查看是否有比第一个示例更简洁的示例,该示例必须为每个测试值一遍又一遍地重复相同的变量。
更新:
我决定接受CoreyN的回答,因为这似乎是最简单的方法。我认为这是实用的,对于新手来说仍然很简单。
不幸的是,在我工作的地方,我们的系统使用.NET 2.0框架,并且没有机会很快升级。除了我能想到的最明显的解决方案之外,是否还有其他不依赖.NET 3.5框架的解决方案:
new List<int>(new int[] { 3, 6, 7, 1 }).Contains(5);
解决方案
回答
bool b = new int[] { 3,7,12,5 }.Contains(5);
回答
我通常在类似这样的简单情况下使用CoreyN的解决方案。更为复杂的是使用LINQ查询。
回答
由于我们未指定要输入的数据类型,因此我假设我们可以将输入划分为2-> 2,4,8,16的幂...这将使我们可以使用这些位来确定如果测试值是输入中的位之一。
4 => 0000100
16 => 0010000
64 => 1000000
使用一些二进制数学...
testList = 4 + 16 + 64 => 1010100
testValue = 16
testResult = testList和testValue
回答
我们可以利用T数组实现IList <T>,而IList <T>具有Contains方法这一事实,对.NET 2.0进行类似的操作。因此,以下内容等效于Corey的.NET 3.5解决方案,尽管显然不够清晰:
bool b = ((IList<int>)new int[] { 3, 7, 12, 5 }).Contains(5);
我经常将IList <T>用于数组声明,或者至少用于传递一维数组参数。这意味着我们可以使用IList属性(例如Count),并轻松地从数组切换到列表。例如。
private readonly IList<int> someIntegers = new int[] { 1,2,3,4,5 };