如何利用int数组构建LINQ条件筛选目标数组元素?
筛选第二个数组中存在于第一个数组的元素
需求
我有两个int类型数组,希望仅保留第二个数组中存在于第一个数组内的元素。
示例代码
int[] first = new int[2] { 1, 2 }; int[] second = new int[5] { 99, 1, 2, 97, 95 };
错误尝试及问题
我试过以下写法,但无法满足需求:
foreach(int x in first){ second.Where(s=>s==x); }
这段代码只是循环遍历第一个数组的元素,每次单独筛选出等于当前x的元素,但既没有合并结果,也没实现正确的匹配逻辑——你需要的是判断元素是否存在于第一个数组的任意元素中,而非同时等于所有元素。
正确的LINQ实现
基础写法(使用Contains)
直接用Contains方法判断元素是否在第一个数组中,封装了你需要的“或”逻辑(相当于s == first[0] || s == first[1] || ...):
var filteredArray = second.Where(s => first.Contains(s)).ToArray();
执行后filteredArray的结果是{1, 2},符合预期。
优化写法(适合大数据量)
如果第一个数组元素较多,先把它转成HashSet<int>可以大幅提升查找效率(HashSet的Contains是O(1)时间复杂度,数组的Contains是O(n)):
var firstHashSet = new HashSet<int>(first); var filteredArray = second.Where(s => firstHashSet.Contains(s)).ToArray();
补充说明
你之前构想的s==x[0] && s==x[1] && ...逻辑本身是错误的——一个整数不可能同时等于多个不同的数,这种条件只会返回空结果(除非第一个数组所有元素完全相同)。正确的逻辑应该是“或”判断,而Contains正好帮我们实现了这一点。
内容的提问来源于stack exchange,提问作者Paul Viorel
相关产品推荐
相关产品推荐

