检测锯齿状阵列中的类似元素

时间:2015-09-05 14:18:58

标签: c# arrays multidimensional-array

有没有办法检测多维数组中的类似元素?例如:

int[][] arrayA = {{1 , 2}, {4 , 6}, {3, 7}};
int[][] arrayB = {{3 , 2}, {1 , 2}, {8, 5}};

arrayAarrayB都有元素{1 , 2}。 (或者简单地说,任何共同的元素)有没有办法检测它是true

5 个答案:

答案 0 :(得分:1)

是的,您只需要对逻辑进行编码即可进行检测。

    bool result = false;
    foreach (var arrayAItem in arrayA)
    {
        foreach (var arrayBItem in arrayB)
        {
            if (arrayAItem.SequenceEqual(arrayBItem))
            {
                result = true;
                break;
            }
        }
        if (result == true)
        {
            break;
        }
    }

和一个班轮

bool result = arrayA.Any(arrayAItem => arrayB.Any(arrayBItem => arrayAItem.SequenceEqual(arrayBItem)));

答案 1 :(得分:0)

这是什么东西?

arrayA.Where(arr => arrayB.Any(arr2 => arr1.OrderBy(x => x)
                                           .SequenceEquals(arr.OrderBy(x => x)))).ToArray()

如果需要,您可以删除两个OrderBy来电,具体取决于您希望如何将两个数组视为“相同”。

答案 2 :(得分:0)

如果不给你代码,很难给你答案,但是:

对于数组A中的每个元素,检查它是否等于数组B中的每个元素。所以基本上,你需要一个嵌套的foreach。如果要记录它们共有的元素,请将它们添加到List<ElementType>(不是数组,因为您要动态填充它)。

由于你的数组是嵌套的,所以它并不那么简单。你不能只检查arrayA[x] == arrayB[x],因为你要比较数组,它们是引用类型(它会返回false,除非它们都指向同一块内存)。相反,您必须在已经拥有的两个foreach内添加一个循环来检查int中的每个arrayAarrayB中相关的int==是一种值类型,因此TextView比较会表现出您的预期。

答案 3 :(得分:0)

以下是如何做到这一点(而不仅仅是):

var commonItems = from innerA in arrayA
                  from innerB in arrayB
                  where innerA.SequenceEqual(innerB)
                  select innerA;
bool anyCommon = commonItems.Any();
var firstCommon = commonItems.FirstOrDefault();
var commonCount = commonItems.Count();

我猜变量名称是不言自明的: - )

答案 4 :(得分:0)

以下代码变长,但会为您提供所需的输出:

    private void TestArrays()
    {
        int[,] arrayA = new[,] { { 1, 2 }, { 4, 6 }, { 3, 7 } };
        int[,] arrayB = new[,] { { 3, 2 }, { 1, 2 }, { 8, 5 } };

        int parentLengthA = arrayA.GetLength(0);
        int childLengthA = arrayA.GetLength(1);
        int parentLengthB = arrayB.GetLength(0);
        int childLengthB = arrayB.GetLength(1);

        int[] itemsOfA;
        int[] itemsOfB;

        List<int[]> matchedArrays = new List<int[]>();

        for (int i = 0; i < parentLengthA; i++)
        {
            itemsOfA = new int[childLengthA];

            for (int j = 0; j < parentLengthB; j++)
            {
                itemsOfB = new int[childLengthB];

                bool isMatched = true;

                if (itemsOfA.Length != itemsOfB.Length)
                {
                    isMatched = false;
                    break;
                }

                for (int k = 0; k < itemsOfA.Length; k++)
                {
                    if (arrayA[i, k] != arrayB[j, k])
                    {
                        isMatched = false;
                        break;
                    }
                    else
                    {
                        itemsOfA[k] = arrayA[i, k];
                    }
                }

                if (isMatched)
                {
                    matchedArrays.Add(itemsOfA);
                }
            }
        }

        //Just to output the matched array(s)
        if (matchedArrays.Count > 0)
        {
            StringBuilder sb = new StringBuilder();
            foreach (int[] matchedArray in matchedArrays)
            {
                foreach (int i in matchedArray)
                {
                    sb.Append(i + ",");
                }

                sb.AppendLine();
            }

            MessageBox.Show(sb.ToString());
        }
    }