如何按值集合Count对SortedDictionary排序?尝试代码未生效
按List的Count属性对SortedDictionary排序的实现方法
SortedDictionary<TKey, TValue>本身是基于键默认排序的,无法直接修改它的内部排序逻辑来按值排序,必须将其转换为可排序的集合后再处理。
你的代码问题分析
你写的代码逻辑本身是正确的,但没生效大概率是两个原因:
- 你依然在操作原
map集合(它还是保持按键排序),没有使用排序后的myList - 你需要的是降序排序(Count大的在前),但代码实现的是升序(Count小的在前)
修正后的实现方式
方式1:简化List.Sort写法
把匿名委托换成Lambda表达式更简洁,同时确保使用排序后的列表:
var map = new SortedDictionary<string, List<Account>>(); // 假设已为map填充数据 // 转换为List并排序 var sortedList = map.ToList(); // 升序排序(Count小的项在前) sortedList.Sort((pair1, pair2) => pair1.Value.Count.CompareTo(pair2.Value.Count)); // 若需要降序,反转比较顺序即可 // sortedList.Sort((pair1, pair2) => pair2.Value.Count.CompareTo(pair1.Value.Count)); // 后续操作排序后的sortedList,原map不受影响 foreach (var item in sortedList) { // 处理排序后的键值对 }
方式2:用LINQ实现(更直观)
使用LINQ的OrderBy或OrderByDescending可以直接生成排序后的序列,代码可读性更高:
var map = new SortedDictionary<string, List<Account>>(); // 填充数据 // 升序排序:按Account列表Count从小到大排列 var sortedAsc = map.OrderBy(kv => kv.Value.Count); // 降序排序:按Account列表Count从大到小排列 var sortedDesc = map.OrderByDescending(kv => kv.Value.Count); // 遍历使用排序后的结果 foreach (var kv in sortedDesc) { Console.WriteLine($"键: {kv.Key}, 账户数量: {kv.Value.Count}"); }
核心注意事项
- 原
SortedDictionary的排序规则是固定的(按键排序),排序后的结果只能存储在新的集合/序列中,无法改变原map的排序逻辑 - 无论用哪种方式,都必须使用排序后的结果集,原
map不会发生任何变化
内容的提问来源于stack exchange,提问作者rejkid
相关产品推荐
相关产品推荐

