求C#中按元素出现次数从数组移除匹配项的方法(Linq优先)
解决方案
需求明确:从数组arr1中移除arr2内各元素对应的出现次数,保留剩余元素(需考虑元素重复出现的次数,而非简单的集合交集/差集)。
实现思路
- 先统计
arr2中每个元素的出现次数,用字典存储键值对(元素: 出现次数) - 遍历
arr1的每个元素,若该元素在字典中还有可移除次数,则减少对应计数并跳过该元素;否则保留该元素
Linq实现代码
using System.Linq; using System.Collections.Generic; public static class ArrayHelper { public static int[] GetLeftElements(int[] arr1, int[] arr2) { var elementCountMap = arr2.GroupBy(item => item) .ToDictionary(group => group.Key, group => group.Count()); return arr1.Where(item => { if (elementCountMap.TryGetValue(item, out int remaining) && remaining > 0) { elementCountMap[item]--; return false; } return true; }).ToArray(); } }
测试示例
int[] arr1 = new int[] { 1, 1, 1, 2, 3 }; int[] arr2 = new int[] { 1, 2 }; int[] result = ArrayHelper.GetLeftElements(arr1, arr2); // 输出结果:{ 1, 1, 3 },完全符合需求
关于Intersect的问题
Intersect方法的作用是取两个集合的去重交集,它只判断元素是否同时存在于两个集合中,完全不考虑元素的出现次数,所以无法满足你的需求,因此不能使用这个方法。
内容的提问来源于stack exchange,提问作者Basil Kosovan
相关产品推荐
相关产品推荐

