我需要检查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");
答案 0 :(得分:12)
您无法在不迭代的情况下检查数组。所以O(n)
是你得到的最好的。另一个解决方案是控制加载数组并在有人试图在其中放置一个不是0
或1
的值时抛出异常。另一个解决方案可能是使用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