• C# .Net 中字典Dictionary<TKey,TValue>泛型类 学习浅谈


    一、综述:

    Dictionary<TKey,TValue>是在 .NET Framework 2.0 版中是新增的。表示键值对的集合,Dictionary<TKey,TValue>类是作为一个哈希表来实现的,通过键来检索值的速度非常快(检索速度取决于为 TKey 指定的类型的哈希算法的质量),接近于 O(1),效率比List<T>高很多。

    二、常用方法:

    示例:

    var  dict = new Dictionary<int, string>();
    for (var i = 3; i < 10; i++)
    {
           dict[i] ="a"+i.ToString();
    }

    1. 获取值(TValue)

    a. 利用键索引,字典中不存在该键时会抛出异常。

    var rt1= dict[3];

    b. TryGetValue(Tkey,out TValue) 推荐使用,第一个参数是键,第二个是获取相关联的值。如果未找到键,获取适当的默认值;例如,为 int 类型为 0,bool为 false,引用类型为null,例如string。该方法返回类型为bool类型,找到并成功获取到值返回true,否则返回false。

    string rt2;
    var rtBool = dict.TryGetValue(3, out rt2);

    2. 获取其中的项(键值对)KeyValuePair<TKey, TValue>

    a.  First(),属于扩展方法。 返回字典中的第一个匹配项,返回的结果是一个键值对。当没有找到匹配项的时候引发异常

    var r3 = dict.First(j => j.Key == 3);

    b.  FirstOrDefault(),属于扩展方法。返回字典中的第一个匹配项,结果也是一个键值对,没有找到匹配项时不引发异常,且返回一个默认的键值对。例如,TValue为 int 类型为 0,bool为 false,引用类型为null。这个与常规的返回值不一样,需要特别注意。

    var r4 = dict.FirstOrDefault(j => j.Key == 12);

    没有找到的返回结果

    3. ContainsKey(TKey) 确定 Dictionary<TKey, TValue> 是否包含指定的键(TKey)。返回值类型为bool

    var r5 = dict.ContainsKey(1);

    4. ContainsValue(TValue) 确定 Dictionary<TKey, TValue> 是否包含特定值(TValue)。返回值类型为bool

    var r6 = dict.ContainsValue("a1");

    5. 新添加值 Add(TKey,TValue) ,没有返回值,如果插入失败(例如插入重复键)将引发异常。

    dict.Add(11, "a11");

    需要注意的是利用dict[TKey]=TValue同样可以实现插入,但同时也是编辑。它等同于

    if (dict.ContainsKey(11))
    {
         dict[11] = "a11";//修改更新
    }
    else
    {
         dict.Add(11,"a11");//插入添加
    }

    6. 删除 Remove(TKey),返回值为bool型。如果成功找到并移除该元素,则为 true;否则为 false。如果是循环查找删除,不可以使用foreach,应当使用for。否则可能会引发异常。

        var keyArray = dict.Keys.ToArray();
        for (var i = 0; i < keyArray.Length; i++)
        {
            if (dict[keyArray[i]].Contains("a"))
            {
                var r7 = dict.Remove(keyArray[i]);
            }
        }

    7. 清空字典 Clear() ,没有参数,也没有返回值。该方法会把集合中的元素对其他对象的引用也被释放。 容量保持不变。此方法的运算复杂度为 O(n),其中 n 是字典的容量。

    dict.Clear()

    三、注:

    1. Dictionary<TKey,TValue>中的任何键都必须是唯一的。

    2. 键不能为空引用,但是如果值类型 TValue 为引用类型,该值则可以为空。

    3. foreach 语句是对枚举数的包装,只允许该枚举数读取集合,而不允许对Dictionary<TKey,TValue>写入、删除。

    4. 只要不修改该集合,Dictionary<TKey, TValue> 就可以同时支持多个阅读器。 即便如此,从头到尾对一个集合进行枚举本质上并不是一个线程安全的过程。 当出现枚举与写访问互相争用这种极少发生的情况时,必须在整个枚举过程中锁定集合。 若要允许多个线程访问集合以进行读写操作,则必须实现自己的同步。

  • 相关阅读:
    PAT 甲级 1072 Gas Station (30 分)(dijstra)
    python flask框架学习(二)——第一个flask程序
    python flask框架学习(一)——准备工作和环境配置与安装
    【Beats】Filebeat工作原理(十七)
    【Beats】Filebeat介绍及使用(十六)
    Dapper简介
    Sequelize ORM
    StackExchange / Dapper
    TypeORM 简介
    Egg.js 是什么?
  • 原文地址:https://www.cnblogs.com/fancyblogs/p/7155190.html
Copyright © 2020-2023  润新知