在C#中比较两个数组

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

我需要将数组A的所有元素与数组B的元素进行比较,并在B中出现重复元素的情况下,将hasDuplicate设置为TRUE。

如果你把你尝试过的内容发出来,我们可以指出你哪里出错了,或许。但是你没有这样做,我们不应该替你完成作业 - undefined
说真的,那段代码无法编译。看一下你的数组声明。 - undefined
现在,away声明应该没问题了 - undefined
11个回答

24

这个答案太棒了。谢谢你。 - undefined

6

我知道您不想要单行解决方案,但我将为其他可能需要同一问题的用户留下我的答案。

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

bool equal = Array1.SequenceEqual(Array2);

希望这有所帮助。


6

既然这是一道作业题,那么我会给你一个作业答案。

当然,你可以使用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(n2),但在您的情况下可能并不重要。使用LINQ的其他答案肯定更有效率,如果效率很重要,您可以考虑使用这些答案。另一种选择是使用break停止循环,如果hasDuplicate为true,或者将此代码放入一个方法中并使用return退出该方法。


5

不是最高效的方法,但可能是最易于理解的方法,类似于这样:

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²),这意味着一个数组中元素数量增加一倍,操作所需时间就会增加两倍(最坏情况);同时增加两个数组中元素的数量,操作所需时间将会增加四倍。
更优雅的解决方案将会使用预定义方法,正如其他解决方案中所描述的那样。但由于这是作业内容,我不认为你被允许使用这些“捷径”(或者应该使用它们)。
永远记住:即使你在这里找到了解决方案,请尝试理解它们,以此为灵感来源,然后写下你自己的代码。这可能是学习的最佳方式。不要只是复制粘贴。

4

如果您想学习并想要编写算法,那么使用LINQ和其他技术是不会帮助到您的。

您需要嵌套2个foreach(或for,以您喜欢的为准)循环,一旦在第一个循环中找到与第二个循环中的成员匹配的成员,则将布尔变量设置为true并break循环。


4
尽管使用LINQ可以用一行代码完成此操作,但最好了解其工作原理,因为您在问题中提到了算法这个词:)
循环遍历数组并将每个项与第二个数组中的项进行比较。如果存在,则返回true。否则返回false。我会将其包装在以下函数中。
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循环,请点击这里.


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)的解决方案。


1

为什么不尝试使用LINQ呢?看一下以下代码:

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

        int count = a.Intersect(b).Count();
        if (count >= 1)
            hasDuplicate = true;

        return hasDuplicate;

    }

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;
        }
    }
}

0
你应该对数据进行排序,O(nlog n),然后你可以简单地通过每个数据进行一次遍历,O(n),在遍历过程中递增最小的数据。 注意数据中出现相同数字两次的情况,例如:
a = {1 3 3 5 8}
b = {2 3 5 5 8}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接