字典排序_【c# .net】排序字典(SortedDictionary)

排序字典(SortedDictionary)

1.简介

SortedDictionary<TKey,TValue> 类是检索运算复杂度为 O(log n) 的二叉搜索树,其中 n 是字典中的元素数。

它与 SortedList<T> 泛型类相似。这两个类具有相似的对象模型,并且都具有 O(log n) 的检索运算复杂度。

这两个类的区别在于内存的使用以及插入和移除元素的速度:

1)SortedList 使用的内存比 SortedDictionary 少。

2)SortedDictionary 可对未排序的数据执行更快的插入和移除操作:它的时间复杂度为 O(log n),而SortedList 为 O(n)。

3)如果使用排序数据一次性填充列表,则 SortedList 比 SortedDictionary 快。


2.特性介绍

1) key(键) 是唯一的,不可重复,同时 key 区分大小写

2) 只能通过 key(键) 查询对应 的 value(值) ,因为元素的存储与顺序无关,同时不能在指定位置插入元素,增减元素都会根据规则自动排序

3)key(键) 不能为 null ,但 value(值) 可以

4)容量是字典最大包含的元素数,会根据元素增减而动态调整容量


SortedDictionary<TKey,TValue> 类的方法和属性

1)下表列出了 SortedDictionary<TKey,TValue> 类的一些常用的 属性:

属性描述
IComparer Comparer { get; }获取元素的排序类型
int Count { get; }获取键/值对的数目
TValue item[TKey key] { get; set; }获取或设置指定键的值
KeyCollection Keys { get; }获取键的集合
ValueCollection Values { get; }获取值的集合

2)下表列出了 SortedDictionary<TKey,TValue> 类的一些常用的 方法

方法描述
void Add (TKey key, TValue value);添加指定键值对元素
void Clear ();移除所有元素
bool ContainsKey (TKey key);判断是否包含指定键
bool ContainsValue (TValue value);判断是否包含指定值
bool Remove (TKey key);移除包含指定键的元素并返回布尔值表示执行情况
bool TryGetValue (TKey key, out TValue value);判断是否包含指定键,如果有,返回它的值
void CopyTo (KeyValuePair[] array, int index);复制所有元素到 KeyValuePair 数组的指定索引处

代码演示

注意:为了方便阅读,以下将代码拆分为多段进行演示,实际运行可以把代码直接拼接起来

using System;
using System.Collections;
using System.Collections.Generic;

namespace SortedDictionaryTest
{
    class Program
    {
        static void Main(string[] args)
        {
            SortedDictionaryTest();
            Console.ReadKey();
        }
        //为了方便后续验证结果,先封装两个简单方法
        /// <summary>
        /// 分隔线
        /// </summary>
        static void 分割线()
        {
            Console.WriteLine("n ------------------------------------------- n");
        }
        /// <summary>
        /// 遍历 SortedDictionary 中的所有元素
        /// </summary>
        static void FSDictionary<K, V>(SortedDictionary<K, V> sdictionary)
        {
            Console.WriteLine(" 元素:");
            foreach (var item in sdictionary)
            {
                Console.WriteLine(" Key = {0}, Value = {1}", item.Key, item.Value);
            }
            分割线();
        }
        static void SortedDictionaryTest()
        {
            //new 时必须为泛型,可以指定比较器(如果你知道怎么使用比较器的话),不可指定容量
            SortedDictionary<int, string> sd = new SortedDictionary<int, string>();
            sd.Add(9, "九");
            sd.Add(8, "八");
            sd.Add(7, "七");
            sd.Add(6, "六");
            sd.Add(1, "一");
            sd.Add(5, "五");
            sd.Add(3, "三");
            sd.Add(2, "二");
            Console.WriteLine("n 遍历排序字典: ");
            FSDictionary(sd);
            Console.WriteLine("n 获取元素的排序类型: n {0}", sd.Comparer);
            //Count 指的是字典的实际元素个数而不是指容量
            Console.WriteLine("n 获取键/值对的数目: n {0}", sd.Count);
            //item 可以为 key 赋值,如果已经赋值过,则修改它的值,如果 key 不存在则会报错
            Console.WriteLine("n 获取或设置指定键的值: n item[6]:{0}", sd[6]);
            Console.WriteLine("n 获取键的集合: Keys   ");
            foreach (var item in sd.Keys) Console.Write(" " + item);
            分割线();
            Console.WriteLine("n 获取值的集合: Values ");
            foreach (var item in sd.Values) Console.Write(" " + item);
            分割线();
        }
    }
}

运行结果:

029e8b1c7320ad5e5e75b858da89a6e5.png
            Console.WriteLine("n 1.添加指定键值对元素: 10, 十n");
            //无法添加带有相同 Key 的元素,运行时会报错
            //sd.Add(2, "二");
            sd.Add(10, "十");
            FSDictionary(sd);

            Console.WriteLine("n 2.判断是否包含指定键: 8:{0}n", sd.ContainsKey(8));
            分割线();

            Console.WriteLine("n 3.判断是否包含指定值: 八:{0}n", sd.ContainsValue("八"));
            分割线();

运行结果:

7925444c0eec9861cbce8c0a93af2f13.png
            Console.WriteLine("n 4.移除元素并返回布尔值: 10:{0}n", sd.Remove(10));
            FSDictionary(sd);
           
            Console.WriteLine("n 5.判断是否包含指定键,如果有,返回它的值: n");
           //如果没有该键,则返回该类型的默认值,不会报错
            string values;
            Console.WriteLine(" {0},{1}",sd.TryGetValue(10,out values),values);

            Console.WriteLine("n 6.复制所有元素到 KeyValuePair 的指定索引处: n");
            复制时,需要注意容器数组长度,长度不足会越界报错,且数据类型必须一致
            KeyValuePair<int, string>[] keyValue = new KeyValuePair<int, string>[sd.Count*2];
            sd.CopyTo(keyValue,2);
            foreach (var item in keyValue)
            {
                Console.WriteLine(" Key = {0}, Value = {1}", item.Key, item.Value);
            }

运行结果:

b70d12d28e8f926d67ad928d0f1a9d4e.png
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值