如何检查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)
是你得到的最好的。 另一个解决方案是控制加载数组并在有人试图将一个非0
或1
的值放入时抛出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