带双参数的Scheduler列表排序后外部不生效问题求助
Scheduler排序后未生效的问题解决方案
你遇到的是C#中引用类型参数传递的典型误区——虽然List<T>是引用类型,但你在SortedByType方法里重新赋值参数的操作,并不会影响外部的原始列表实例。
问题根源
当你在SortedByType里执行scheduler = scheduler.OrderBy(...).ToList();时,OrderBy会生成一个全新的序列,ToList()又创建了一个新的Listscheduler指向了这个新实例。但外部Transfusion方法里的scheduler仍然引用着原来的List,所以排序后的新列表根本没被外部使用到。
解决方案
这里有两种简单且实用的修复方式,你可以根据代码风格选择:
方案1:让方法返回排序后的列表
修改SortedByType方法,让它返回排序后的新List,然后在Transfusion里接收这个返回值:
// 修改后的SortedByType方法 public List<Event> SortedByType(List<Event> scheduler) { var sortedScheduler = scheduler.OrderBy(a => a.Type).ThenBy(a => a.EventTime).ToList(); foreach (var schedul in sortedScheduler) Console.WriteLine($"{schedul.Type} : {schedul.EventTime}"); Console.Read(); return sortedScheduler; }
然后在Transfusion方法中更新调用逻辑:
// 在Transfusion里替换原列表引用 scheduler = SortedByType(scheduler);
方案2:直接在原始列表上排序(不创建新实例)
如果不想生成新的List实例,可以使用List<T>.Sort方法直接对原列表进行排序,这样外部的引用会直接看到排序后的结果:
// 修改后的SortedByType方法 public void SortedByType(List<Event> scheduler) { // 直接在原列表上执行排序逻辑 scheduler.Sort((a, b) => { // 先按Type排序,Type相同则按EventTime排序 int typeComparison = a.Type.CompareTo(b.Type); if (typeComparison != 0) return typeComparison; return a.EventTime.CompareTo(b.EventTime); }); foreach (var schedul in scheduler) Console.WriteLine($"{schedul.Type} : {schedul.EventTime}"); Console.Read(); }
这种方式不需要修改Transfusion里的调用代码,因为排序操作直接作用在传入的原始List实例上。
验证效果
无论选择哪种方案,你在Transfusion方法里调用SortedByType后,后续操作的scheduler都会是排序后的结果,再执行scheduler.RemoveAt(0)之类的操作就会基于正确的顺序了。
内容的提问来源于stack exchange,提问作者TyRRRax
相关产品推荐
相关产品推荐

