How to check if an array contains any item of another array
给定2个int数组,如foo和bar,检查数组栏是否至少包含一个foo包含的项的最有效方法是什么?应返回真/假。
我怀疑嵌套的foreach,但只是想知道是否有更好的方法?
- 这是作业吗?数组是任意大的,还是小于,比如说,100个元素?除了暴力前臂,你还试过别的吗?
- 不,不是家庭作业!…我想可能有个不错的办法。
使用LINQ:
1
| array1.Intersect(array2).Any() |
注:使用Any()可确保在找到第一个相等对象时,交集算法停止。
- 使用any()确保在找到第一个相等的对象时,交集算法停止。
- 请记住,所有array1都是枚举的,因此如果可能,您可能希望将较短的数组作为array1
- 我从未听说过intersect方法,所以我必须查找它的功能:msdn.microsoft.com/en-us/library/bb460136.aspx它基本上提供了在两个比较数组中都可以找到的项的列表。使用any操作符,您就可以知道array1和array2在这种情况下是否具有相同的字符串。
C 3:
1
| bool result = bar.Any(el => foo.Contains(el)); |
C 4并行执行:
1
| bool result = bar.AsParallel().Any(el => foo.AsParallel().Contains(el)); |
- 在我的例子中,foo是el的子字符串。因此,bool result = bar.Any(el => foo.Contains(el));不会给出所需的结果。有什么关于如何实现这个查询的建议吗?
- 在这种情况下,使用Any()和Contains()比其他方法更快;)。
是的,嵌套循环,尽管其中一个是隐藏的:
1 2 3 4 5 6 7
| bool AnyAny(int[] A, int[]B)
{
foreach(int i in A)
if (B.Any(b=> b == i))
return true;
return false;
} |
另一个解决方案:
1
| var result = array1.Any(l2 => array2.Contains(l2)) == true ?"its there":"not there"; |
如果您有类而不是像int等内置数据类型,那么需要重写类的override Equals和GetHashCode实现。
对于单次随机数组方法,您的方法似乎是最快的。如果对一个或两个矩阵进行排序,知道它们的上/下限,或者其中一个比另一个更为罕见地进行更改,并且您执行了许多检查,那么有一些方法可以提高效率。重要的是,您可以准备各种散列、索引和提示,以将搜索优化到几乎为零,但仅索引过程通常需要一次以上的搜索。
- 好的观点,但不清楚你在和谁说话,如果你包含一些与op q或某个特定答案直接相关的代码,这会很有帮助。
- @G.Stoynev:我正在和提问者交谈,我相信答案应该是什么,我怀疑嵌套的"foreach"比较是否足够复杂,足以允许发布"一些代码",除非OP用我提到的"特殊条件"之一来限定问题,否则没有必要猜测哪一个适用于对两个数组进行单次检查,我们对嵌套foreach一无所知,这是最好的解决方案。