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

C# Linq排序异常:OrderBy与OrderByDescending均返回升序结果求助

问题分析与解决

核心问题1:Linq方法未接收返回值

OrderByDescending这类Linq方法是非原地排序,不会修改原列表,而是返回一个新的排序后的序列。你之前的代码只是调用了方法,但没有将返回结果赋值给sortedList,所以原列表还是之前用Sort按Value排序后的状态。

核心问题2:错误的类型转换

OrderByDescending返回的是IEnumerable<T>类型,不能直接强制转换为List<T>,必须调用.ToList()方法来生成新的List实例。

正确实现方式

方式1:使用Linq完成排序(推荐)

直接跳过之前的Sort步骤,一步到位生成按Key.Caliber降序的列表:

Dictionary<GunSO, int> gunsDictionary = shipControl.shipWrapper.cargo.GetEquippedGunsDictionary();
// 直接通过Linq生成降序列表,无需先转List再Sort
List<KeyValuePair<GunSO, int>> sortedList = gunsDictionary
    .OrderByDescending(x => x.Key.Caliber)
    .ToList();

int b = 0;
foreach (KeyValuePair<GunSO, int> pair in sortedList)
{
    print($"pair[{b}].Key.Caliber = {pair.Key.Caliber}");
    b++;
}

方式2:修改原List.Sort的委托实现降序

如果你想保留List.Sort的原地排序方式,需要修改委托中的比较逻辑,让它返回降序的结果:

Dictionary<GunSO, int> gunsDictionary = shipControl.shipWrapper.cargo.GetEquippedGunsDictionary();
List<KeyValuePair<GunSO, int>> sortedList = gunsDictionary.ToList();

// 修改比较逻辑,用pair2的Caliber和pair1比较,实现降序
sortedList.Sort(delegate (KeyValuePair<GunSO, int> pair1, KeyValuePair<GunSO, int> pair2)
{
    return pair2.Key.Caliber.CompareTo(pair1.Key.Caliber);
});

int b = 0;
foreach (KeyValuePair<GunSO, int> pair in sortedList)
{
    print($"pair[{b}].Key.Caliber = {pair.Key.Caliber}");
    b++;
}

补充说明

  • CompareTo方法的返回值:当a.CompareTo(b)返回正数时,a会排在b后面;返回负数时a排在b前面。所以要降序的话,就用b.CompareTo(a)。
  • 你的初始代码中先用Sort按Value排序,之后又调用OrderByDescending但没赋值,这两步其实是冲突的,只需要保留其中一种排序逻辑即可。

内容的提问来源于stack exchange,提问作者user20494201

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 11:35:25