控制台应用中列表按名称排序失败及枚举修改异常求助
问题解决思路
1. 遍历集合时调用Sort()触发异常的解决方案
异常System.InvalidOperationException: Collection was modified; enumeration operation may not execute.的核心原因是:foreach遍历过程中不允许修改集合的结构或元素顺序,而Sort()方法会重新排列列表元素,属于集合修改操作。
正确做法是将排序操作移至遍历之前执行:
case 1: // View Products Console.Clear(); currentItemList.Sort(); // 先完成排序,再执行遍历 foreach (var item in currentItemList) { item.Display(); } break;
2. Sort()不生效的排查与修复
检查CompareTo方法的健壮性
你当前的CompareTo实现逻辑本身正确,但如果Name字段存在null值,会触发空引用异常,建议补充判空逻辑:
public int CompareTo(Item b) { if (b == null) return 1; // 可选添加忽略大小写的排序规则,根据需求调整 return string.Compare(this.Name, b.Name, StringComparison.OrdinalIgnoreCase); }
同时确认currentItemList确实是从Products字典中正确获取的目标列表,避免引用错误的集合。
LINQ OrderBy的正确用法
OrderBy方法不会修改原列表,而是返回一个新的排序后序列,因此必须遍历这个新序列才能看到排序效果:
case 1: // View Products Console.Clear(); // 生成排序后的新列表并遍历 var sortedList = currentItemList.OrderBy(o => o.Name).ToList(); foreach (var item in sortedList) { item.Display(); } break;
如果需要让原列表保持排序状态,可将新列表赋值给原变量:currentItemList = sortedList;
3. 额外优化建议
- 无需在
Item构造函数添加元素后立即排序,仅在查看前执行排序即可,减少不必要的性能消耗。 - 若需要列表始终保持有序,可在每次添加元素后调用
Sort()(单线程控制台应用无需考虑线程安全问题)。
内容的提问来源于stack exchange,提问作者dangoqut132
相关产品推荐
相关产品推荐

