5

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

使用哪里():

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

3 回答 3

13

如果不遍历数组,就无法检查数组。你O(n)会得到最好的也是如此。0另一种解决方案是控制加载数组并在有人尝试将一个不在其中或其中的值放入时抛出异常1。另一种解决方案可能是使用 abool[]无论如何只有两个可能的值,但如果您确实需要数字,则需要进行一些转换。(注意:如果您需要两个以上的值,那么查看 可能是有意义的enum,特别是如果这些值应该代表某些东西

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

if (myArray.Any(a => a != 0 && a != 1))
{
     // ....
}
于 2015-11-18T18:52:08.143 回答
0

您可以尝试使用Array.TrueForAll

if (!Array.TrueForAll(myArray, n => n == 0 || n == 1))
     throw new Exception("Array contains invalid values");
于 2015-11-18T19:05:10.903 回答
0

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

测试

int[] data = new int[100000000];

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

到目前为止,您需要在数组中搜索几个值,unswer 是 - 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
于 2015-11-18T19:08:01.083 回答