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

C#中Dictionary添加数据后如何按指定排序类型完成排序

问题原因

  • 所有LINQ排序方法(OrderBy/OrderByDescending)都不会修改原集合,只会返回一个新的排序后的序列,你原有代码中没有把排序结果赋值给任何变量,执行完就被丢弃了,所以原Dictionary没有任何变化。
  • 常规的Dictionary<TKey, TValue>是哈希表结构,本身不保证固定的遍历顺序,即便你把排序后的内容重新存入普通Dictionary,也不能保证后续遍历顺序符合预期。

解决方案

如果你不想额外定义新变量,可以直接复用原变量名,将变量类型改为支持排序的序列类型即可,示例代码如下:

string SortType="ByDownloads";
// 先声明为IEnumerable<KeyValuePair<string, Data>>类型,方便后续赋值排序结果
IEnumerable<KeyValuePair<string, Data>> WorldInfo = JsonConvert.DeserializeObject<Dictionary<string, Data>>(Res.Body.ToString());

switch (SortType)
{
    case "ByDownloads":
        WorldInfo = WorldInfo.OrderByDescending(AllData => AllData.Value.PostDownloads);
        break;
    case "ByViews":
        WorldInfo = WorldInfo.OrderBy(AllData => AllData.Value.PostViews);
        break;
    // 可补充default分支设置默认排序规则
    default:
        WorldInfo = WorldInfo.OrderBy(AllData => AllData.Key);
        break;
}

后续你直接遍历WorldInfo就能拿到排序后的结果,不需要额外的新变量。

如果你必须保留Dictionary类型的变量,那可以用排序后的结果重新构造字典(注意该方式依赖.NET Core 3.0+ / .NET 5+ 中Dictionary保留插入顺序的实现特性,不建议在跨版本兼容的代码中使用):

string SortType="ByDownloads";
Dictionary<string, Data> WorldInfo = JsonConvert.DeserializeObject<Dictionary<string, Data>>(Res.Body.ToString());

switch (SortType)
{
    case "ByDownloads":
        WorldInfo = WorldInfo.OrderByDescending(AllData => AllData.Value.PostDownloads).ToDictionary(kv=>kv.Key, kv=>kv.Value);
        break;
    case "ByViews":
        WorldInfo = WorldInfo.OrderBy(AllData => AllData.Value.PostViews).ToDictionary(kv=>kv.Key, kv=>kv.Value);
        break;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 02:48:02