C#中OrderedDictionary按值数量降序排序报错的解决方法
解决OrderedDictionary按值数量降序排序的问题
错误原因
OrderedDictionary属于非泛型集合(位于System.Collections.Specialized命名空间),它未实现LINQ方法依赖的IEnumerable<KeyValuePair<TKey, TValue>>接口,因此无法直接调用OrderByDescending这类LINQ扩展方法。同时你原代码中ToDictionary返回的普通Dictionary,不仅与OrderedDictionary类型不匹配,还会丢失排序后的顺序(Dictionary不保证元素顺序)。
可行解决方案
将非泛型的OrderedDictionary转换为泛型集合排序后,重新构建一个新的OrderedDictionary来保留排序结果:
// 1. 将OrderedDictionary元素转为泛型键值对,并按值的数量降序排序 var sortedItems = dic.Cast<DictionaryEntry>() .Select(entry => new KeyValuePair<string, List<string>>( (string)entry.Key, (List<string>)entry.Value)) .OrderByDescending(kv => kv.Value.Count); // 2. 创建新的OrderedDictionary,沿用原有的字符串比较规则 var sortedOrderedDic = new OrderedDictionary(StringComparer.CurrentCultureIgnoreCase); // 3. 将排序后的元素逐个加入新的OrderedDictionary,保留顺序 foreach (var item in sortedItems) { sortedOrderedDic.Add(item.Key, item.Value); } // 替换原字典为排序后的结果 dic = sortedOrderedDic;
额外说明
Cast<DictionaryEntry>():这是LINQ处理非泛型集合的必要步骤,将OrderedDictionary的非泛型元素转换为可遍历的DictionaryEntry类型。- 手动构建
OrderedDictionary:LINQ的ToDictionary返回的普通Dictionary不维护插入顺序,只有OrderedDictionary能确保排序后的元素顺序被保留。
内容的提问来源于stack exchange,提问作者ankit goel
相关产品推荐
相关产品推荐

