C# 如何使用LINQ获得阵列重叠?

C# 如何使用LINQ获得阵列重叠?,c#,linq,arrays,C#,Linq,Arrays,假设我有以下数组: List<int[]> numbers = new List<int[]>(); numbers.Add(new int[] { 1, 2, 3 }); numbers.Add(new int[] { 3, 4, 5 }); numbers.Add(new int[] { 5, 6, 7 }); int[] numbersToFind = new int[] { 4, 5, 6 }; 列表编号=新列表(); 添加(新的int[{1,2,3}); 添

假设我有以下数组:

List<int[]> numbers = new List<int[]>();
numbers.Add(new int[] { 1, 2, 3 });
numbers.Add(new int[] { 3, 4, 5 });
numbers.Add(new int[] { 5, 6, 7 });

int[] numbersToFind = new int[] { 4, 5, 6 };
列表编号=新列表();
添加(新的int[{1,2,3});
添加(新的int[]{3,4,5});
添加(新的int[{5,6,7});
int[]numbersToFind=新的int[]{4,5,6};
我想找出哪个
数字
元素包含
numbersToFind
中的一个或多个值,有没有一种简单的方法可以使用LINQ实现这一点?也就是说,在上面的示例中,一些代码将返回一个
IEnumerable
,其中包含
int[]{3,4,5}
int[]{5,6,7}

如何做到这一点?

试试以下方法:

numbers.Where(array => array.Any(value => numbersToFind.Contains(value)));
var query = numbers.Where(n => numbersToFind.Any(x => n.Contains(x)));
numbers.Where(a => a.Any(s => numbersToFind.Contains(s)));
下面是一种使用方法
Enumerable.Intersect
的替代方法:

var query = numbers.Where(n => numbersToFind.Intersect(n).Any());
试试这个:

var query = numbers.Where(n => numbersToFind.Any(x => n.Contains(x)));
numbers.Where(a => a.Any(s => numbersToFind.Contains(s)));
祝你好运

IEnumerable matches=numbers.Where(n=>numbersToFind.Intersect(n.Any());
IEnumerable<int[]> matches = numbers.Where(n => numbersToFind.Intersect(n).Any());

有一个LINQ函数
Intersect
专门用于执行此操作:

number.Intersect(numbersToFind)

+1我刚把这个添加到我的答案中,但你比我快了几分钟。我认为这可能比得票最多的答案要好。:)Intersect()将为Where lambda的每次计算创建一个
哈希映射。因此,它将更慢,消耗更多内存,并创建更多GC搅动。(至少在这个有限的例子中。)@cdhowie:我认为它会扩展得更好——我还没有测试过它。我不确定OPs问题中的例子是否应该被理解为他将要做的那种查询的代表性例子,或者是否为了解释的目的而对其进行了简化。我猜是后者。它不会扩展。对于每个正在考虑的源数组中的每个数字,将创建一个全新的
HashMap
,并用
numbersToFind
的内容填充。我的示例将迭代
numbersToFind
的每个元素,直到找到匹配项,其中
Intersect()
将构造一个
HashMap
并迭代每个元素以构建hash映射,最后检查它是否包含所考虑的值。很抱歉,但在任何情况下都不可能更快。如果速度是一个巨大的问题,那么
numbersToFind
本身应该是一个
哈希映射。那么我的示例将执行得更快。