C#字典Dictionary排序(顺序、倒序)

本文详细介绍了如何在.NET 2.0和3.5及以上版本中对字典进行排序,包括按值和键排序的方法。对于.NET 2.0版本,通过使用泛型列表和委托实现排序,而对于.NET 3.5及以上版本,则利用LINQ简化了排序过程。

C# .net 3.5 以上的版本引入 Linq 后,字典Dictionary排序变得十分简单,用一句类似 sql 数据库查询语句即可搞定;不过,.net 2.0 排序要稍微麻烦一点,为便于使用,将总结 .net 3.5 和 2.0 的排序方法。

 

  一、创建字典Dictionary 对象

  假如 Dictionary 中保存的是一个网站页面流量,key 是网页名称,值value对应的是网页被访问的次数,由于网页的访问次要不断的统计,所以不能用 int 作为 key,只能用网页名称,创建 Dictionary 对象及添加数据代码如下:

  Dictionary<stringint> dic = new Dictionary<stringint>();
  dic.Add("index.html", 50);
  dic.Add("product.html", 13);
  dic.Add("aboutus.html", 4);
  dic.Add("online.aspx", 22);
  dic.Add("news.aspx", 18);

 

  二、.net 3.5 以上版本 Dictionary排序(即 linq dictionary 排序)

  1、dictionary按值value排序

  private void DictonarySort(Dictionary<stringint> dic)
  {
    var dicSort = from objDic in dic orderby objDic.Value descending select objDic;
    foreach(KeyValuePair<stringint> kvp in dicSort)
      Response.Write(kvp.Key + ":" + kvp.Value + "<br />");
  }

  排序结果:

  index.html:50
  online.aspx:22
  news.aspx:18
  product.html:13
  aboutus.html:4

  上述代码是按降序(倒序)排列,如果想按升序(顺序)排列,只需要把变量 dicSort 右边的 descending 去掉即可。

 

  2、C# dictionary key 排序

  如果要按 Key 排序,只需要把变量 dicSort 右边的 objDic.Value 改为 objDic.Key 即可。

 

 

  三、.net 2.0 版本 Dictionary排序

  1、dictionary按值value排序(倒序)

  private void DictionarySort(Dictionary<stringint> dic)
  {
    if (dic.Count > 0)
    {
      List<KeyValuePair<stringint>> lst = new List<KeyValuePair<stringint>>(dic);
      lst.Sort(delegate(KeyValuePair<stringint> s1, KeyValuePair<stringint> s2)
      {
        return s2.Value.CompareTo(s1.Value);
      });
      dic.Clear();

      foreach (KeyValuePair<stringint> kvp in lst)
        Response.Write(kvp.Key + ":" + kvp.Value + "<br />");
    }
  }

  排序结果:

  index.html:50
  online.aspx:22
  news.aspx:18
  product.html:13
  aboutus.html:4

  顺序排列:只需要把变量 return s2.Value.CompareTo(s1.Value); 改为 return s1.Value.CompareTo(s2.Value); 即可。

 

  2、C# dictionary key 排序(倒序、顺序)

  如果要按 Key 排序,倒序只需把 return s2.Value.CompareTo(s1.Value); 改为 return s2.Key.CompareTo(s1.Key);;顺序只需把return s2.Key.CompareTo(s1.Key); 改为 return s1.Key.CompareTo(s2.Key); 即可。

原文链接:http://www.liangshunet.com/ca/201311/125404032.htm

C#中,对 `Dictionary` 进行倒序操作主要依赖于排序机制,并将其结果重新构造为新的字典。根据使用的 .NET 版本不同,可以采用不同的方法来实现这一功能。 ### 使用LINQ对Dictionary进行倒序操作(.NET 3.5及以上版本) 在 .NET 3.5 及以上版本中,可以通过 LINQ 实现简洁的倒序操作。以下代码展示了如何根据值进行降序排列,并将排序后的结果转换为一个新的 `Dictionary`: ```csharp using System; using System.Collections.Generic; using System.Linq; class Program { static void Main() { Dictionary<string, int> dic = new Dictionary<string, int>(); dic.Add("index.html", 50); dic.Add("product.html", 13); dic.Add("aboutus.html", 4); dic.Add("online.aspx", 22); dic.Add("news.aspx", 18); var sortedDic = dic.OrderByDescending(kvp => kvp.Value).ToDictionary(kvp => kvp.Key, kvp => kvp.Value); foreach (var item in sortedDic) { Console.WriteLine($"{item.Key}: {item.Value}"); } } } ``` 上述代码中,`OrderByDescending` 方法用于按照值进行降序排列,而 `ToDictionary` 则将排序后的键值对重新构造为一个新的字典[^1]。 ### 使用自定义排序逻辑对Dictionary进行倒序操作(.NET 2.0) 在 .NET 2.0 中,由于缺乏 LINQ 支持,需要手动实现排序逻辑。可以通过将字典内容复制到一个 `List<KeyValuePair<string, int>>` 中,然后使用 `Sort` 方法结合自定义比较逻辑来实现倒序排列: ```csharp using System; using System.Collections.Generic; class Program { static void Main() { Dictionary<string, int> dic = new Dictionary<string, int>(); dic.Add("index.html", 50); dic.Add("product.html", 13); dic.Add("aboutus.html", 4); dic.Add("online.aspx", 22); dic.Add("news.aspx", 18); List<KeyValuePair<string, int>> lst = new List<KeyValuePair<string, int>>(dic); lst.Sort(delegate(KeyValuePair<string, int> s1, KeyValuePair<string, int> s2) { return s2.Value.CompareTo(s1.Value); }); Dictionary<string, int> sortedDic = new Dictionary<string, int>(); foreach (var item in lst) { sortedDic.Add(item.Key, item.Value); } foreach (var item in sortedDic) { Console.WriteLine($"{item.Key}: {item.Value}"); } } } ``` 上述代码中,通过 `Sort` 方法结合自定义委托实现了根据值的大小进行倒序排列[^2]。 ### 注意事项 - **字典的不可变性**:`Dictionary` 是无序的集合,因此排序后的结果需要重新构造为一个新的字典。 - **性能考虑**:对于大型字典,频繁的排序操作可能会导致性能问题,因此需要合理选择排序时机。 - **键的唯一性**:在重新构造新的字典时,需要确保键的唯一性,否则会抛出异常。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值