关于c#:如何检查数组是否包含另一个数组的任何项

How to check if an array contains any item of another array

给定2个int数组,如foobar,检查数组栏是否至少包含一个foo包含的项的最有效方法是什么?应返回真/假。

我怀疑嵌套的foreach,但只是想知道是否有更好的方法?


使用LINQ:

1
array1.Intersect(array2).Any()

注:使用Any()可确保在找到第一个相等对象时,交集算法停止。


C 3:

1
bool result = bar.Any(el => foo.Contains(el));

C 4并行执行:

1
bool result = bar.AsParallel().Any(el => foo.AsParallel().Contains(el));


是的,嵌套循环,尽管其中一个是隐藏的:

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 EqualsGetHashCode实现。


对于单次随机数组方法,您的方法似乎是最快的。如果对一个或两个矩阵进行排序,知道它们的上/下限,或者其中一个比另一个更为罕见地进行更改,并且您执行了许多检查,那么有一些方法可以提高效率。重要的是,您可以准备各种散列、索引和提示,以将搜索优化到几乎为零,但仅索引过程通常需要一次以上的搜索。