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

时间:2015-11-18 18:47:26

标签: c# arrays error-checking

我需要检查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");

3 个答案:

答案 0 :(得分:12)

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

此外,Where不是最好的解决方案,因为你被迫检查整个数组(没有提前退出)。改为使用Any(但它基本上仍在执行你的for循环正在做的事情 - 最好的情况O(1),更差O(n)平均值O(n))。

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

答案 1 :(得分:0)

您可以尝试使用Array.TrueForAll

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

答案 2 :(得分:0)

根据您的问题,这是研究博客文章 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