我有两个数组,一个是单数,另一个是二维。
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];
}
}
我觉得所有人都需要搜索最后两位数是对这个函数的一个小改动,我试图添加另一个循环,但那也没有工作。我该怎么做呢?我之所以使用循环而不是包含是因为我还在学习基础知识。
答案 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();
<强>阐释:强>
答案 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);
}
}
}