如何用#分隔符实现用户输入?C#重复值检测代码报错求解决
解决C#中以#分隔的整数序列输入处理及重复值统计问题
原代码运行报错且存在逻辑缺陷,以下是问题分析和修正方案:
问题点梳理
- Split方法调用错误:C#的
string.Split没有直接接收字符串参数的重载,传入"#"会引发编译错误,需改用字符分隔符'#'或字符串数组重载。 - 无效输入未处理:连续
##会分割出空字符串,直接用Int32.Parse解析会抛出格式异常;同时未校验用户输入的内容是否为有效整数。 - 重复值统计逻辑偏差:原代码仅统计连续重复的分组数,若同一值非连续出现(如
1#2#1)无法正确识别,且未排除空字符串带来的无效元素。
修正后的代码
public class Program { public static void Main(string[] args) { Console.WriteLine("==========================="); Console.WriteLine("Please enter single line containing a list of integers, separated by '#':"); string userInput = Console.ReadLine(); if (!string.IsNullOrWhiteSpace(userInput)) { // 用字符分割并自动过滤空字符串 string[] numberStrings = userInput.Split('#', StringSplitOptions.RemoveEmptyEntries); List<int> numbers = new List<int>(); foreach (string numStr in numberStrings) { // 安全解析整数,跳过无效内容 if (int.TryParse(numStr, out int num)) { numbers.Add(num); } else { Console.WriteLine($"警告:'{numStr}' 不是有效整数,已跳过"); } } // 统计重复的不同值数量(如输入1#2#3##2,结果为1,因为只有2重复) var repeatedValues = numbers.GroupBy(n => n) .Where(group => group.Count() > 1); int totalDuplicateNumbers = repeatedValues.Count(); // 若需要统计重复出现的总次数(如2出现2次,算1次重复;出现3次算2次),可替换为: // int totalDuplicateCount = repeatedValues.Sum(g => g.Count() - 1); Console.WriteLine($"The sequence contains {totalDuplicateNumbers} repeated values."); } else { Console.WriteLine("Wrong input"); } Console.WriteLine("==========================="); } }
关键修改说明
- Split优化:
Split('#', StringSplitOptions.RemoveEmptyEntries)既解决了重载错误,又自动剔除分割产生的空字符串,避免后续解析异常。 - 安全解析:用
int.TryParse替代Int32.Parse,有效避免无效输入导致的程序崩溃,同时给用户明确的警告提示。 - 准确统计重复值:借助LINQ的
GroupBy对数字分组,直接筛选出现次数大于1的分组,无论重复值是否连续都能正确统计不同重复值的数量,逻辑更简洁可靠。
内容的提问来源于stack exchange,提问作者jose mathew
相关产品推荐
相关产品推荐

