C#经典系列-键值对
1.ToDictionary,ToLookup
从图中我们看到有四个ToXXX的方法,其中ToArray和ToList,用的是非常非常多
我们有这样的一个实体
class student{public string StuNo { get; set; } //学号public string Grand { get; set; } //年级public string Sex { get; set; } //性别}
年级和学号是一对多的关系,也就是说一个年级可能包含几个学号,每个学号都有自己对应的性别
class Program{static void Main(string[] args){ }public static List<student> GetList(){return new List<student>(){new student(){StuNo="0001",Grand="一年级",Sex="男"},new student(){StuNo="0002",Grand="二年级",Sex="男"},new student(){StuNo="0003",Grand="一年级",Sex="女"},new student(){StuNo="0004",Grand="一年级",Sex="男"},new student(){StuNo="0005",Grand="二年级",Sex="男"},new student(){StuNo="0006",Grand="一年级",Sex="女"},new student(){StuNo="0007",Grand="二年级",Sex="男"},new student(){StuNo="0008",Grand="一年级",Sex="男"},new student(){StuNo="0009",Grand="二年级",Sex="女"},new student(){StuNo="0010",Grand="一年级",Sex="男"},new student(){StuNo="0011",Grand="三年级",Sex="女"},new student(){StuNo="0012",Grand="一年级",Sex="人妖"},new student(){StuNo="0013",Grand="三年级",Sex="女"}};}}
这种初始化类对象的方法以及返回方式:
student s= new student() { Sex = "nan" };
举个例子: 我需要统计各个年级中的学号情况。
很明显,这是一个分组排序的问题,可能你马上就想起了groupby来实现,当然groupby是可以实现的,不过groupby不能算是一种数据结构,不能带有索引,没有字典那样容易输出和操作。
方案一: 采用普通的foreach循环。
一般情况下,可能有一部分人都采用这种原始的方法,将list数据通过foreach循环放到dictionary中,就是代码写的多一些,也算是最灵活的。
static void Main(string[] args){Dictionary<int, student> dic = new Dictionary<int, student>();List<student> stulist = GetList();foreach (var item in stulist){if (!dic.ContainsKey(item.Grand)){dic.Add(item.Grand, item);}else{dic[item.Grand] = item;}}}
结果
方案二:使用ToDictionary
Dictionary是一种键值方式(值是一个对象)
从图中我们可以看到,发生悲剧的异常了,我们知道dictionary中key是不能重复的,然而ToDictionary中并没有给我们做key的重复值判断,那也就侧面说明ToDictionary在kv中只能是 “一对一”的关系,也就是v中永远只会有一条记录,显然这不是我需要的,在了解ToDictionary原理后,该方案失败。
如果没有重复的
class Program{static void Main(string[] args){List<student> stulist = GetList();var dic = stulist.ToDictionary(m=>m.Grand);}public static List<student> GetList(){return new List<student>(){new student(){StuNo="0001",Grand=1,Sex="男"},new student(){StuNo="0002",Grand=2,Sex="男"},new student(){StuNo="0003",Grand=3,Sex="女"},};}}
结果是
Dictionary的下标只能是键
方案三: 使用ToLookup(键值对,值是一组对象)
ToDictionary的加强版,可以认为是一种新的字典数据结构,它就避免了这种“一对一”的关系,采用“一对多”的实现。
static void Main(string[] args){var stulist = GetList();var dic = stulist.ToLookup(i=>i.Grand);foreach (var item in dic){Console.WriteLine("年级:" + item.Key);foreach (var item1 in item){Console.WriteLine("\t\t" + item1.StuNo + " " + item1.Sex);}}}
结果
而且ToLookup和字典一样,是带有索引形式,这个groupby就不具备了,当然Tolookup还有一个强大的功能,就是使用Func<TSource, TElement> elementSelector来对现在的v元素进行转换来避免刚才 Console.WriteLine("\t\t" + item1.TicketNo + " " + item1.Description);语句
static void Main(string[] args){var stulist = GetList();var dic = stulist.ToLookup(i => i.Grand, j => { return j.StuNo + "\t" + j.Sex; });foreach (var item in dic){Console.WriteLine("年级:" + item.Key);foreach (var item1 in item){Console.WriteLine("\t\t"+ item1);}}}
输出同样的结果
2.键值对集合
SortedList<TKey, TValue>( ) 表示根据键进行排序的键/值对的集合,而键基于的是相关的 IComparer<T> 实现。
SortedDictionary<TKey, TValue>() 表示根据键进行排序的键/值对的集合。
使用KeyValuePair对其进行遍历
SortedList<int, string> sortedList = new SortedList<int, string>();foreach (Value val in enumValues){sortedList.Add(Convert.ToInt32(val.EnumValueIndex), val.EnumValueName);}foreach (KeyValuePair<int, string> e in sortedList){string strName = e.Value;SelectListItem myli = new SelectListItem{Text = strName,Value = e.Key.ToString(),Selected = (e.Key == value)};cpType.Add(myli);}
转载于:https://www.cnblogs.com/tech-bird/p/3634699.html
C#经典系列-键值对相关推荐
- Mysql数据库基础系列(二):表结构、键值
表结构 约束条件 查看约束条件 mysql> desc 库名.表名; 字段名----| 类型---------------| 空------ |键值-- |默认值---- |额外设置 | 设置约 ...
- Android官方开发文档Training系列课程中文版:数据存储之键值对序列存储
原文地址:http://android.xsoftlab.net/training/basics/data-storage/index.html 引言 大多数的安卓APP需要保存数据,即使仅仅存储在o ...
- 内的 对象 获取 键值对_前端系列——Object对象数据类型详细剖析
问题: 普通对象有哪些操作? 什么是数组对象? 回答: 1--解答:普通对象是用{}包裹起来的,由零到多组属性值和属性名组成的一种数据类型.属性是描述当前对象特征的,属性名是当前具备特征的名称,属性值 ...
- Windows系列系统 修改键盘默认对应键值(修改ctrl与fn位置, 解决键盘重要键损坏问题)
一.出现问题 1.surface 自带微软键盘坏了,临时用个蓝牙键盘,顶上,这个键盘设计很不是适应,类似于联想那种将Fn键与Ctrol键设计,Fn键在键盘最左角!!! 一按ctrol加快捷键就出现Fn ...
- windows黑客编程系列(四):修改注册表键值对之自启动
文章目录 自启动技术 注册表 WINAPI介绍 RegOpenKeyEx函数 参数说明 返回值 RegSetValueEx 参数说明 返回值 编码 运行效果 自启动技术 对于一个病毒木马来说,重要的不 ...
- 红黑树 键值_查找(一)史上最简单清晰的红黑树讲解
http://blog.csdn.net/yang_yulei/article/details/26066409 查找(一) 我们使用符号表这个词来描述一张抽象的表格,我们会将信息(值)存储在其中,然 ...
- fastjson查找指定键值_分布式键值存储 etcd
引言 前面的文章中,介绍了基于Paxos的ZooKeeper,本文将介绍另一种分布式一致性算法Raft的工业级实现----etcd,它们虽然实现方案不同,但是最终的实现效果都很像,而且etcd相较于Z ...
- Flink 状态管理:算子状态、键值分区状态、状态后端、有状态算子的扩缩容
文章目录 状态管理 算子状态 键值分区状态 状态后端(State Backends) 有状态算子的扩缩容 状态管理 通常意义上,函数里所有需要任务去维护并用来计算结果的数据都属于任务的状态,可以把状态 ...
- Spark常用函数讲解之键值RDD转换
摘要: RDD:弹性分布式数据集,是一种特殊集合 ‚ 支持多种来源 ‚ 有容错机制 ‚ 可以被缓存 ‚ 支持并行操作,一个RDD代表一个分区里的数据集 RDD有两种操作算子: Tran ...
最新文章
- 玩爬虫不会登陆?这个工具拿走不谢!
- Android内核开发:系统编译输出的镜像文件
- vmware下linux虚拟机传文件解决方案之 xftp
- (转)Apache与Tomcat 区别联系
- 房贷月供4300,10万够买支付宝定期,一年利息能否抵一个月月供?
- 基于MM2的跨IDC kafka热备多活方案
- 【Flink】Flink ClosureCleaner 闭包清除
- 从0 开始 WPF MVVM 企业级框架实现与说明 ---- 第十讲 WPF 系统MainWindow
- [INS-32025] 所选安装与指定 Oracle 主目录中已安装的软件冲突。
- 【语音隐写】基于matlab小波变换算法求解水印嵌入提取【含Matlab源码 513期】
- 网页自动调入软键盘输入中文
- 华为机试真题 C++ 实现【处理器问题】【2022.11 Q4 新题】
- Linux软件 绑定硬件ID 做加密 cryptopp RSA-encryption
- 初中三年级计算机表格考试模拟,初中三年要做这些事情,三张表格说透初中三年,收藏必看...
- 机器学习之随机森林RandomForestRegressor
- 软件测试基础:邮箱注册功能测试的测试点
- 仿QQ音乐css布局
- D. Colored Rectangles
- 性格色彩测试android程序开发之六--activity界面
- 小白终是踏上了这条不归路----小文的mysql学习笔记(17)----标识列(自增长列)