如何检查数组是否包含另一个数组的任何项

时间:2010-02-15 12:53:52

标签: c# arrays

给定2个int数组,例如foobar,检查数组条包含至少一个foo包含的项的最有效方法是什么。应该返回true / false。

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

6 个答案:

答案 0 :(得分:105)

使用LINQ:

array1.Intersect(array2).Any()

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

答案 1 :(得分:9)

C#3:

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

C#4并行执行:

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

答案 2 :(得分:1)

是嵌套循环,但有一个是隐藏的:

bool AnyAny(int[] A, int[]B)
{
    foreach(int i in A)
       if (B.Any(b=> b == i))
           return true;
    return false;
}

答案 3 :(得分:0)

另一种解决方案:

var result = array1.Any(l2 => array2.Contains(l2)) == true ? "its there": "not there";

如果您使用类而不是内置的数据类型(例如int等),则需要为您的类覆盖Override EqualsGetHashCode实现。

答案 4 :(得分:-1)

对于一次性随机数组方法,您的方法似乎是最快的。如果一个或两个矩阵被排序,它们的上/下界是已知的,或者其中一个变化比另一个更少,并且您执行许多检查,则有一些方法可以提高效率。事情是你可以准备各种哈希,索引和提示,将搜索优化到几乎没有,但索引的过程通常只需要一次搜索。

答案 5 :(得分:-1)

static void Main(string[] args)


    int[] arr1 = { 16, 48, 40, 32, 5, 7 };
    int[] arr2 = { 48, 32, 16, 40, 56, 72, 16, 16, 16, 16, 16, 5, 7, 6, 56 };
    int k = 0;
    for (int i = 0; i < arr1.Length; i++)
    {

        for (int j = 0; j < arr2.Length; j++)
        {

            if (arr1[i] == arr2[j])
            {
                k++;
                break;
            }

        }

    }
    if (arr1.Length == k)
    {
        Console.WriteLine(true);
    }
    else
        Console.WriteLine(false);
}
----