Dictionary 字典类的使用 EnsureCapacity
命名空间:System.Collections.Generic
Dictionary<TKey,TValue> 表示基于键进行组织的键/值对的集合。
List<T> 表示可按索引访问的对象的列表。 提供用于对列表进行搜索、
Queue<T> 表示对象的先进先出 (FIFO) 集合。
SortedList<TKey,TValue> 表示基于相关的 IComparer<T> 实现按键进行排序的键/ 值对的集合。
Stack<T> 表示对象的后进先出 (LIFO) 集合。
实现键/值对集合
Dictionary<TKey,TValue>
泛型集合可通过每个元素的键访问集合中的元素。 每次对字典的添加都包含一个值和与其关联的键。 通过使用键来检索值十分快捷,因为
Dictionary 类实现为哈希表。以下示例创建 Dictionary 集合并通过使用 foreach 语句循环访问字典。
以下示例使用 ContainsKey 方法和 Dictionary 的 Item[] 属性按键快速查找某个项。 使用 Item 属性可通过 C#
中的 elements[symbol] 来访问 elements 集合中的项。
private static void FindInDictionary(string symbol)
{
Dictionary<string, Element> elements = BuildDictionary();
}
if (elements.ContainsKey(symbol) == false)
{
Console.WriteLine(symbol + " not found");
}
else
{
Element theElement = elements[symbol];
Console.WriteLine("found: " + theElement.Name);
}
内置方法的使用
EnsureCapacity 方法预设一个容量,而无需进一步扩展其后备存储器。 当你知道这个集合最大可能装多少是可以使用该方法。如果集合超过该预设范围 也不会引发异常。
假设需求里一个班最多100个学生,就可以在创建list的时候将容量设置为100。
说白了就是怕内存重新申请和拷贝,List里面存的是引用类型的话,应该影响比较小。不过在确定体量的情况下,先定义容量的话,会比较好。
list 中数组是按照2 4 8 16 这样方式扩容的。扩容后要旧的数组中的内容拷贝到新数组中,当数据大了以后这样就影响性能,然后指针指向新数组,旧数组等待垃圾回收。
var list = new Dictionary<int,int>(); list.EnsureCapacity(100); for (var i = 0; i < 5; i++) { list.Add(i,i); Console.WriteLine(list[i]); } list.Add(5,6); Console.WriteLine(list[5]);
TryGetValue 方法按键快速查找某个项。
private static void FindInDictionary2(string symbol)
{
Dictionary<string, Element> elements = BuildDictionary();
}
Element theElement = null;
if (elements.TryGetValue(symbol, out theElement) == false)
Console.WriteLine(symbol + " not found");
else
Console.WriteLine("found: " + theElement.Name);
扩展方法
批量添加
List<T> 类有个 AddRange 方法,可以不用 foreach 循环直接向当前集合加入另外一个集合:
List<string> roles = new List<string>(); roles.AddRange(new[] { "role2", "role2" }); roles.AddRange(user.GetRoles());
相当方便,可怜 Dictionary<TKey, TValue> 类没有,幸好有扩展方法:
/// <summary> /// 向字典中批量添加键值对 /// </summary> /// <param name="replaceExisted">如果已存在,是否替换</param> public static Dictionary<TKey, TValue> AddRange<TKey, TValue>(this Dictionary<TKey, TValue> dict, IEnumerable<KeyValuePair<TKey, TValue>> values, bool replaceExisted) { foreach (var item in values) { if (dict.ContainsKey(item.Key) == false || replaceExisted) dict[item.Key] = item.Value; } return dict; }
使用示例:
var dict1 = new Dictionary<int, int>() .AddOrReplace(2, 2) .AddOrReplace(3, 3); var dict2 = new Dictionary<int, int>() .AddOrReplace(1, 1) .AddOrReplace(2, 1) .AddRange(dict1, false);
原文地址:https://www.cnblogs.com/cdaniu/p/15388974.html
- 从零基础学三分查找
- Codeforces Beta Round #1 A,B,C
- 线性分类器-中篇
- isupper()函数
- HDU 5882 Balanced Game
- 超级玛丽游戏
- POJ 3673 Cow Multiplication
- HDU 5144 NPY and shot(物理运动学+三分查找)
- 深度|Python股票数据分析
- HDU 2438 Turn the corner(三分查找)
- UVAlive 3708 Graveyard(最优化问题)
- HDU 1754 I Hate It(线段树之单点更新,区间最值)
- Selenium2+python自动化19-单选和复选框
- Uva 11300 Spreading the Wealth(递推,中位数)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- python算法题练习---二分法
- 局部加权线性回归 | 冰水数据智能专题 | 3rd
- 一文探讨 RPC 框架中的服务线程隔离
- Python3与Python2的具体区别
- 分布式系统的概念都搞懂了吗?(上)
- Kafka-manager部署与使用简单介绍
- 面向对象的7种设计原则(5)-里氏代换原则
- CentOS7下利用Google Authenticator实现SSH登录的二次身份验证
- 满分室间质评之GATK Somatic SNV+Indel+CNV+SV(下)性能优化
- poiAndEasyExcel学习(六)
- C++ 模板沉思录(上)
- Python 为什么会有个奇怪的“...”对象?
- 老板让我从几百个Excel中查找数据,我用Python一分钟搞定!
- 爬取B站20万+条弹幕,我学会了如何成为B站老司机
- Pytorch实现卷积神经网络训练量化(QAT)