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
相关产品推荐
相关产品推荐

