如何检查int 是否只包含某些数字?

我需要检查int []是否只包含某些值(在本例中为0s和1s),如果不包含则抛出exception。

有没有比以下任何一种解决方案更有效的方法?

简单(但O(n)):

for(int n = 0; n < myArray.Length; n++) if(!(myArray[n] == 0 || myArray[n] == 1)) throw new Exception("Array contains invalid values"); 

使用Where():

 if(myArray.Where(n => !(n==1 || n==0)).ToArray().Length > 0) throw new Exception("Array contains invalid values"); 

如果不迭代它就无法检查数组。 所以O(n)是你得到的最好的。 另一个解决方案是控制加载数组并在有人试图将一个非01的值放入时抛出exception。 另一个解决方案可能是使用bool[] ,它只有两个可能的值,但如果你真的需要数字则需要一些转换。 (注意:如果你需要两个以上的值,那么查看enum可能是有意义的,特别是如果这些值应该代表某些东西

此外, Where不是最佳解决方案,因为您被迫检查整个arrays(没有提前退出)。 使用Any代替(但它仍然基本上做你的for循环正在做的事情 – 最好的情况是O(1) ,更糟的是O(n)平均O(n) )。

 if (myArray.Any(a => a != 0 && a != 1)) { // .... } 

您可以尝试使用Array.TrueForAll

 if (!Array.TrueForAll(myArray, n => n == 0 || n == 1)) throw new Exception("Array contains invalid values"); 

根据您的问题http://www.tkachenko.com/blog/archives/000682.html,这是研究博客文章

测试

 int[] data = new int[100000000]; 

如果你真的对性能感兴趣,你不应该使用Any()肯定)))))

所以到目前为止你需要在数组中搜索几个值,unswer是 – for循环搜索或foreach(在你的情况下编译成CIL的int []和for循环)是你的最佳选择

 foreach loop search: 39 ms for loop search: 39 ms Contains() method search: 56 ms Any() method search: 446 ms IndexOf() method search: 57 ms