如何检查 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)
是你能得到的最好的。另一种解决方案是控制加载数组,并在有人试图在其中放入一个不是 0
或 1
的值时抛出异常。另一种解决方案可能是使用 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
我需要检查 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)
是你能得到的最好的。另一种解决方案是控制加载数组,并在有人试图在其中放入一个不是 0
或 1
的值时抛出异常。另一种解决方案可能是使用 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