You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

带双参数的Scheduler列表排序后外部不生效问题求助

Scheduler排序后未生效的问题解决方案

你遇到的是C#中引用类型参数传递的典型误区——虽然List<T>是引用类型,但你在SortedByType方法里重新赋值参数的操作,并不会影响外部的原始列表实例。

问题根源

当你在SortedByType里执行scheduler = scheduler.OrderBy(...).ToList();时,OrderBy会生成一个全新的序列,ToList()又创建了一个新的List实例,随后你把方法内部的局部变量scheduler指向了这个新实例。但外部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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:26:46