【问题标题】:Check if all elements from one array are in the second array c#检查一个数组中的所有元素是否都在第二个数组c#中
【发布时间】:2020-03-27 14:27:30
【问题描述】:

如何检查一个数组中的所有元素是否都在另一个数组中?我有一个包含 3 个数组的二维数组,我想检查所有这 3 个数组是否包含所有数字中的所有元素。数组1=所有数字?数组2=所有数字?数组1=所有数字2?如果至少一个包含 allnumbers 中的所有元素,我需要返回 true。我有下面的代码,但我需要它不包含超过 3 个控制流语句。

// int[,][] array = {array1, array2, array3}
static bool CheckLine(int[,][] array)
        {
            const int maxL = 9;
            bool result = false;
            int[] allnumbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
            foreach (var singlearray in array)
            {
                int[] arr = singlearray;
                int p = 0;
                foreach (var num in allnumbers)
                {
                    foreach (var arraynumber in singlearray)
                    {
                        if (arraynumber == num)
                        {
                            p++;
                        }
                    }

                    if (p == maxL)
                    {
                        result = true;
                        break;
                    }
                }
            }

            return result;
        }

【问题讨论】:

  • 你试过用Except方法吗?请同时分享int[,][] array 示例

标签: c# arrays


【解决方案1】:

如果您的数组中的值是唯一的,并且您不关心它们的顺序,那么这是HashSet 的工作。 (换句话说,如果您的数组包含一组数字,您可以将它们视为集合。)以下是比较集合的基本概述。

var allnumbersSet = new HashSet<int>(allnumbers);
var allnumbers2Set= new HashSet<int>(allnumbers2);

if (allnumbersSet.IsSupersetOf(allnumbers2Set)) {
   /* everything in allnumbers2 is also in allnumbers1 */
}

将 DotNet 放在一起的人在创建和优化这些集合类方面做得非常好;您可以放心使用它们以获得良好的性能。

【讨论】:

  • 我认为最好保留 allnumbers2,因为 IsSupersetOf 的参数不必是 HashSet。
  • 所以基本上你想要某种 ienumerable 来检查它是否存在
【解决方案2】:

看来,你有二维的jagged array。您可以使用Except 简化代码,并在每次循环迭代时检查allnumbers 数组和单行之间的差异。

static bool CheckLine(int[,][] array)
{
    int[] allnumbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    foreach (var singlearray in array)
    {
        var diff = allnumbers.Except(singlearray);
        if (!diff.Any())
        {
            return true;
        }
    }

    return false;
}

如果差异中没有元素,则表示源二维数组中的单个项目具有allnumbers 数组中的所有元素。

使用示例

var array = new int[2, 2][];
array[0, 0] = new[] { 1, 2, 8 };
array[0, 1] = new[] { 3, 4, 5, 6 };
array[1, 1] = new[] { 3, 2, 1, 4, 5, 7, 6, 10, 9, 8 };
array[1, 0] = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

CheckLine(array);

最后两项满足条件,执行将中断并为{ 3, 2, 1, 4, 5, 7, 6, 10, 9, 8 }数组返回true。另外不要忘记在文件顶部添加using System.Linq 指令

【讨论】:

    【解决方案3】:

    感谢您的帮助。我忘了说我只能使用“使用系统;”

    【讨论】:

    • 我猜,应该是评论,而不是答案。您可以添加using System.Linq;using System.Collections.Generic 以使上述答案有效
    • 我看到了s working with using System.Linq; , but Im 不允许使用它。我只需要使用“使用系统;”
    猜你喜欢
    • 2012-01-27
    • 2016-07-27
    • 2016-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-05
    相关资源
    最近更新 更多