给定2个int数组,例如foo
和bar
,检查数组条包含至少一个foo包含的项的最有效方法是什么。应该返回true / false。
我怀疑嵌套foreach
,但只是想知道是否有更好的方式?
答案 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 Equals
和GetHashCode
实现。
答案 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);
}
----