检查数组中的最后2个数字是否都存在于使用循环的2D数组中

时间:2015-03-25 08:51:53

标签: c# arrays

我有两个数组,一个是单数,另一个是二维。

int[][] array1 = { 
    new int [] {1, 22, 3, 44, 5, 66},
    new int [] {11, 22, 33, 44, 55, 66},
    new int [] {1, 2, 3, 4, 5, 6},
};

int[] array2 = new int[] {1, 2, 3, 5, 66}

我需要创建一个循环,在array1中搜索array2中的第二个最后一个数字,因此它将返回array1包含5和66的数组的次数,即1,因为其他两个只包含1每个号码。

我已经设法写了一个函数,它返回array1中整个array2存在多少次,这个新函数实际上是对它的改进。

for (int a = 0; a < array1[i].Length; a++) 
{                   
    for (int b = 0; b < array2.Length; b++)
    {   
        if (array2[c] == array1[a][b])                            
            count++;

        temp[b] = array1[a][b];
    }
}

我觉得所有人都需要搜索最后两位数是对这个函数的一个小改动,我试图添加另一个循环,但那也没有工作。我该怎么做呢?我之所以使用循环而不是包含是因为我还在学习基础知识。

3 个答案:

答案 0 :(得分:3)

有一点不清楚, 两个数字在2D数组中出现的位置是否重要? 如果不是ithis,那么你可以使用Intersect()通过使用默认的相等比较器来比较值来产生两个序列的集合交集:

var result = array1.Count(x => x.Intersect(array2.Reverse().Take(2)).Count() == 2);

如果您已经注意到了我们已使用此行,则会获取array1的最后两个元素:

array1.Reverse().Take(2);

<强> .NET Fiddle

<强> 其他:

如果你想查找 最后两个数组中的数组 是否等于array1的最后两个元素,那么你可以尝试LINQ解决方案:

var result = array1.Count(x=> x.Reverse().Take(2).SequenceEqual(array2.Reverse().Take(2)));

使用的扩展方法的说明:
Reverse()反转序列中元素的顺序。
Take()从序列的开头返回指定数量的连续元素。
SequenceEqual()通过使用类型的默认相等比较器来比较元素来确定两个序列是否相等。

获取两个数组的最后两个元素后,我们将使用SequenceEqual()来确定两个数组是否相等。

答案 1 :(得分:1)

var res = array1.Where((x) => (x.Contains(array2.Last()) && x.Contains(array2[array2.Length - 2]))).Count();

<强>阐释:

  • array1.Where接受array1的每个子数组并过滤那些数组    满足一定条件。
  • 条件是每个子阵列    array1包含最后一个&amp;&amp; array2的倒数第二个元素。
  •    Count()方法返回满足的子数组    条件

答案 2 :(得分:0)

您可以创建一个目标值数组,然后计算该数组与2D数组中每个子数组的交集包含目标数组中所有项的次数:

using System;
using System.Linq;

namespace ConsoleApplication2
{
    class Program
    {
        [STAThread]
        private static void Main()
        {
            int[][] array1 =
            { 
                new [] {1, 22, 3, 44, 5, 66},
                new [] {11, 22, 33, 44, 55, 66},
                new [] {1, 2, 3, 4, 5, 6},
                new [] {1, 66, 3, 4, 5, 6} // This one has the target items out of order.
            };

            int[] array2 = {1, 2, 3, 5, 66};

            // Extract the targets like this; it avoids making a copy
            // of array2 which occurs if you use IEnumerable.Reverse().

            int[] targets = {array2[array2.Length - 2], array2[array2.Length - 1]};

            // Count the number of times that each subarray in array1 includes
            // all the items in targets:

            int count = array1.Count(array => array.Intersect(targets).Count() == targets.Length);

            Console.WriteLine(count);
        }
    }
}