比较C#中的两个数组

时间:2012-06-15 14:01:24

标签: c# arrays

bool hasDuplicate = false;   
int[] a = new int[] {1, 2, 3, 4};
int[] b = new int[] { 5, 6, 1, 2, 7, 8 };

我需要将数组A的所有元素与数组B的元素进行比较,如果B中存在重复元素,则在TRUE上设置hasDuplicate。

11 个答案:

答案 0 :(得分:15)

hasDuplicates = a.Intersect(b).Any();

您可以使用LINQ Intersect方法 - http://msdn.microsoft.com/en-us/library/system.linq.enumerable.intersect.aspx

答案 1 :(得分:4)

如果学习是你所寻求的,而算法是你想要的,那么使用LINQ和任何其他爵士乐都无济于事。

你需要有2个嵌套foreach(或for,无论你喜欢哪个)循环,一旦你在第一个循环中找到一个成员匹配第二个循环中的成员,设置你的布尔变量为真和break循环

答案 2 :(得分:4)

不是最高效,但最容易理解的方法是这样的:

foreach (int _a in a) { // iterate through all elements in array a (as _a)
    foreach (int _b in b) { // iterate through all elements in array b (as _b)
        if (_a == _b) { // if we've got a duplicate
            hasDuplicates = true; // store that for later on
            break; // immediately leave this loop (no point in further looking up)
        }
    }
    if (hasDuplicates) { // if we've got a duplicate
        break; // leave this loop as well (no point in further looking up)
    }
}

显然,这不是最高性能的解决方案,因为复杂性为O(n²),这意味着任何一个数组中元素数量的两倍将使完成操作所需的时间加倍(最坏的情况) ;两个数组中元素数量的两倍将使时间量翻两番。

更优雅的解决方案是使用某些其他解决方案中描述的预定义方法,但由于这是家庭作业,我不希望你被允许使用这些“快捷方式”(或者应该这样做) )。

永远记住:即使您在这里找到解决方案,也要尝试理解它们,将它们用于灵感,然后编写自己的解决方案。这可能是最好的学习方式。不要只是复制&糊。

答案 3 :(得分:4)

由于这是家庭作业,我会给你一个作业答案。

当然,您可以使用LINQ并依赖SequenceEqualIntersect等,但这可能不是练习的重点。

给定两个数组,您可以使用foreach迭代数组中的元素。

int[] someArray;
foreach(int number in someArray)
{
     //number is the current item in the loop
}

因此,如果你有两个相当小的数组,你可以遍历第一个数组的每个数字,然后遍历第二个数组中的所有项目并进行比较。我们试试吧。首先,我们需要更正您的数组语法。看起来应该是这样的:

    int[] a = new int[] {1, 2, 3, 4};
    int[] b = new int[] { 5, 6, 1, 2, 7, 8 };

请注意花括号{的使用。您使用语法创建了一个N维数组。

bool hasDuplicate = false;
int[] a = new int[] { 1, 2, 3, 4 };
int[] b = new int[] { 5, 6, 7, 8 };
foreach (var numberA in a)
{
    foreach (var numberB in b)
    {
        //Something goes here
    }
}

这让我们非常接近。我鼓励你从这里自己尝试一下。如果您仍需要帮助,请继续阅读。


好的,所以我们基本上只需检查数字是否相同。如果是,请将hasDuplicate设置为true。

bool hasDuplicate = false;
int[] a = new int[] { 8, 1, 2, 3, 4 };
int[] b = new int[] { 5, 6, 7, 8 };
foreach (var numberA in a)
{
    foreach (var numberB in b)
    {
        if (numberA == numberB)
        {
            hasDuplicate = true;
        }
    }
}

这是一种非常“粗暴”的力量方法。循环的复杂性是O(n 2 ),但在您的情况下这可能无关紧要。使用LINQ的其他答案肯定更有效,如果效率很重要,你可以考虑这些。另一个选项是,如果break为true,则使用hasDuplicate“停止”循环,或将此代码放在方法中并使用return退出方法。

答案 4 :(得分:3)

我知道您不需要单行解决方案,但我会将其答案留给可能需要针对同一问题的简单解决方案的其他用户。

如果您不想使用Linq,可以使用SequenceEqual

bool equal = Array1.SequenceEqual(Array2);

希望它有所帮助。

答案 5 :(得分:3)

尽管LINQ将通过一行代码帮助您完成此操作,但最好了解它是如何工作的,因为您在问题中提到了算法这个词:)

循环遍历数组并将每个项目与第二个数组中的项目进行比较。如果存在,则返回true。别的假。我会把它包装在像这样的函数中

public bool IsPresentInArray(int[] firstArray, int[] secondArray)
{
    foreach (var itemA in firstArray)
    {
        foreach (var itemB in secondArray)
        {
            if (itemB == itemA)
            {                       
                return true;
            }
        }
    }
    return false;
}

现在我可以这样称呼它

int[] a = new int[]{1, 2, 3, 4};
int[] b = new int[] { 5, 6, 1, 2, 7, 8};

bool present= IsPresentInArray(a, b);

了解foreach循环here

答案 6 :(得分:2)

要有效地将一组中的所有元素与另一组中的元素进行比较,您可以制作其中一个元素的HashSet。此外,您可以在找到第一个匹配项后立即退出循环:

HashSet<int> h = new HashSet<int>(a);
foreach (int i in b) {
  if (h.Contains(i)) {
    hasDuplicate = true;
    break;
  }
}

这是一个O(n + m)解决方案,与两个嵌套循环相比,所有值都是O(n * m)解决方案。

答案 7 :(得分:1)

为什么我们不尝试使用LINQ? 请查看以下代码,

Uncaught SyntaxError: Unexpected token <

答案 8 :(得分:0)

我使用了“IndexOf”和“foreach”循环来创建它。 (注意:前3个“字符串”行只是一个如何创建数组并使其成为正确格式的示例)。

如果要比较2个数组,它们将以分号分隔,但最后一个值后面不会有一个数组。如果在数组的字符串形式中附加一个分号(即a; b; c变为a; b; c;),则可以使用“x;”匹配无论它处于什么位置:

bool found = false;
string someString = "a-b-c";
string[] arrString = someString.Split('-');
string myStringArray = arrString.ToString() + ";";

foreach (string s in otherArray)
{
    if (myStringArray.IndexOf(s + ";") != -1) {
       found = true;
       break;
    }
}

if (found == true) { 
    // ....
} 

答案 9 :(得分:0)

我用for循环做了。关键是我们将每个成员与数组b中的成员进行比较。因此,首先将a[0]与数组b中的每个成员进行比较,然后转到a[1]并执行相同的操作,依此类推,直到找到匹配为止。

bool hasDuplicate = false;

int[] a = new int[] { 1, 2, 3, 4 };
int[] b = new int[] { 5, 6, 1, 2, 7, 8 };

for (int i = 0; i < a.Length; i++)
{
    for (int j = 0; j < b.Length; j++)
    {
        if (a[i] == b[j])
        {
            hasDuplicate = true;
        }
    }
}

答案 10 :(得分:0)

您应该对数据O(nlog n)进行排序,然后可以简单地对它们中的每一个O(n)进行一次遍历,在其中递增最低的数据。 请注意两次具有相同编号的数据,例如:

a = {1 3 3 5 8}

b = {2 3 5 5 8}