将数组x的重复元素存入数组y的C#代码问题排查求助
问题分析与解决方案
我来帮你梳理下代码里的问题,以及对应的修复方案:
问题根源
- 内层循环的
break位置错误:你在else分支外部直接加了break语句,这导致内层循环只执行一次(仅检查j=i+1的位置)就立刻退出,完全没机会遍历后续元素查找重复项。哪怕x[i]在后面的位置有重复,代码也根本不会去检查。 - 重复元素会被多次存入
y数组:即使去掉break,当前逻辑只要找到一个匹配项就往y里加,会导致同一个重复元素被多次存入(比如数组中有3个2,会被添加两次),不符合“每个重复元素仅存入一次”的需求。 else分支逻辑错误:每次x[i] != x[j]就输出“没有重复元素”,这显然不合理——只是当前j位置的元素和i不重复,不代表整个数组中没有重复项。
修正后的代码(基础循环实现)
// 初始化随机生成的数组x int[] x = new int[20]; Random rnd = new Random(); for (int i = 0; i < x.Length; i++) { x[i] = rnd.Next(1, 15); } // 用List存储重复元素(避免固定数组的长度限制) List<int> yList = new List<int>(); for (int i = 0; i < x.Length; i++) { // 如果当前元素已经被标记为重复,跳过后续检查 if (yList.Contains(x[i])) continue; bool isRepeated = false; // 遍历当前元素之后的所有元素,查找重复 for (int j = i + 1; j < x.Length; j++) { if (x[i] == x[j]) { isRepeated = true; break; // 找到一个重复即可停止当前元素的检查,提升效率 } } // 如果确认是重复元素,加入结果列表 if (isRepeated) { yList.Add(x[i]); Console.WriteLine($"找到重复元素: {x[i]}"); } } // 转换为int数组(如果需要数组类型的结果) int[] y = yList.ToArray();
更简洁的LINQ实现(C# 3.0+)
如果你熟悉LINQ,可以用更简洁的代码实现需求,逻辑更清晰:
// 初始化随机数组 int[] x = new int[20]; Random rnd = new Random(); for (int i = 0; i < x.Length; i++) { x[i] = rnd.Next(1, 15); } // 通过LINQ分组筛选重复元素 int[] y = x.GroupBy(num => num) .Where(group => group.Count() >= 2) // 筛选出现次数≥2的元素组 .Select(group => group.Key) // 取出重复元素的值 .ToArray(); // 输出结果 foreach (int num in y) { Console.WriteLine($"重复元素: {num}"); }
调试建议
测试时可以先把随机数组换成固定的测试用例(比如int[] x = {2,5,7,2,8};),这样更容易验证代码逻辑是否正确,避免随机数带来的不确定性。
内容的提问来源于stack exchange,提问作者KacaMat
相关产品推荐
相关产品推荐

