C# 从数组中提取重复元素时返回空数组,请问代码存在什么问题?
问题解答
错误原因
- 你对
Except方法的逻辑理解有误:Except()是集合差集运算,返回第一个集合中存在、但第二个集合中不存在的元素。 - 你先用
numbers.Distinct().ToArray()拿到了原数组所有唯一值的集合,原数组的所有元素必然都包含在这个唯一值集合中,再执行numbers.Except(duplicates).ToArray()自然会得到空数组,完全符合Except的设计逻辑。
正确实现方案
要提取数组中的重复元素,核心逻辑是统计每个元素的出现次数,筛选出出现次数≥2的元素即可,你可以用LINQ的GroupBy方法快速实现:
using System; using System.Linq; namespace ArrayEx4 { internal class Program { static void Display(int[] x) { for (int i = 0; i < x.Length; i++) { Console.WriteLine(x[i]); } } static void Main(string[] args) { int[] numbers = new int[10]; for (int i = 0; i < numbers.Length; i++) { Console.WriteLine("Enter number " + (i + 1) + ": "); numbers[i] = Convert.ToInt32(Console.ReadLine()); } // 核心修改:分组统计后筛选重复元素(每个重复元素仅输出一次) var duplicates = numbers.GroupBy(n => n) .Where(g => g.Count() > 1) .Select(g => g.Key) .ToArray(); Console.WriteLine("\n\nProvided data:\n"); Display(numbers); Console.WriteLine("\n\nDuplicates:"); Display(duplicates); Console.ReadLine(); } } }
如果你需要保留重复元素的所有出现实例(比如数组是[1,2,2,3,3,3],输出结果为[2,2,3,3,3]),可以把核心逻辑改成:
var duplicates = numbers.GroupBy(n => n) .Where(g => g.Count() > 1) .SelectMany(g => g) .ToArray();
内容的提问来源于stack exchange,提问作者UnfreeHeX
相关产品推荐
相关产品推荐

