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

How do I check if int[] contains only certain numbers?

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

是否有比以下任一解决方案更有效的方法?

简单(但复杂度为 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 的值时抛出异常。另一种解决方案可能是使用 bool[] ,它无论如何只有两个可能的值,但如果您确实需要数字,则需要进行一些转换。 (注意:如果您需要两个以上的值,查看 enum 可能有意义,特别是如果这些值应该表示 某物

此外,Where 不是这里的最佳解决方案,因为您被迫检查整个数组(不能提前退出)。使用 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");

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

测试于

int[] data = new int[100000000];

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

到目前为止,您需要在数组中搜索几个值,答案是 - for 循环搜索或 foreach(在您将 int[] 编译到 CIL 中作为 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