挖一挖C#中那些我们不常用的东西之系列(1)——ToDictionary,ToLookup
这个系列我们看看C#中有哪些我们知道,但是又不知道怎么用,又或者懒得去了解的东西,比如这篇我们要介绍的toDictionary
和ToLookup。

从图中我们看到有四个ToXXX的方法,其中ToArray和ToList,我想大家用的是非常非常多,但是ToDictionary和ToLookup
不见得有多少人用了,但不能否认的是这些方法确实很有用。
不多废话了,直接如主题,我们有这样的一个实体,包含:票号,订单号,备注。
class Ticket
{
/// <summary>
/// 票号
/// </summary>
public string TicketNo { get; set; } /// <summary>
/// 订单号
/// </summary>
public int OrderID { get; set; } /// <summary>
/// 备注
/// </summary>
public string Description { get; set; }
}
好了,我们看看需求,票号和订单号是一对多的关系,也就是说一个订单号可能包含几个票号,每个票号都有自己对应的状态,
比如票号有 “改签”,"未使用",“成交”,"退票" 等等,下面我们灌一批数据进去。
public static List<Ticket> GetList()
{
return new List<Ticket>()
{
new Ticket(){ TicketNo="999-12311",OrderID=,Description="改签"},
new Ticket(){ TicketNo="999-24572",OrderID=,Description="退票"},
new Ticket(){ TicketNo="999-68904",OrderID=,Description="成交"},
new Ticket(){ TicketNo="999-24172",OrderID=,Description="未使用"},
new Ticket(){ TicketNo="999-24579",OrderID=,Description="退票"},
new Ticket(){ TicketNo="999-21522",OrderID=,Description="未使用"},
new Ticket(){ TicketNo="999-24902",OrderID=,Description="退票"},
new Ticket(){ TicketNo="999-04571",OrderID=,Description="改签"},
new Ticket(){ TicketNo="999-23572",OrderID=,Description="改签"},
new Ticket(){ TicketNo="999-24971",OrderID=,Description="成交"}
};
}
举个例子: 我需要统计各个订单号中的票号情况。
很明显,这是一个分组排序的问题,可能你马上就想起了groupby来实现,当然groupby是可以实现的,不过groupby不能算是一种数据
结构,不能带有索引,没有字典那样容易输出和操作。
方案一: 采用普通的foreach循环。
一般情况下,可能有一部分人都采用这种原始的方法,将list数据通过foreach循环放到dictionary中,就是代码写的多一些,也算
是最灵活的。
Dictionary<int, Ticket> dic = new Dictionary<int, Ticket>();
foreach (var item in ticketlist)
{
if (!dic.ContainsKey(item.OrderID))
{
dic.Add(item.OrderID, item);
}
else
{
dic[item.OrderID] = item;
}
}
方案二:使用ToDictionary

从图中我们可以看到,发生悲剧的异常了,我们知道dictionary中key是不能重复的,然而ToDictionary中并没有给我们做
key的重复值判断,那也就侧面说明ToDictionary在kv中只能是 “一对一”的关系,也就是v中永远只会有一条记录,显然这不是
我需要的,在了解ToDictionary原理后,该方案失败。
方案三: 使用ToLookup
也许微软知道客户有这么个需求,就采用了一个ToDictionary的加强版,你也可以认为是一种新的字典数据结构,它就避免了这
种“一对一”的关系,采用“一对多”的实现。
var dic = ticketlist.ToLookup(i => i.OrderID);
foreach (var item in dic)
{
Console.WriteLine("订单号:" + item.Key);
foreach (var item1 in item)
{
Console.WriteLine("\t\t" + item1.TicketNo + " " + item1.Description);
}
}

而且ToLookup和字典一样,是带有索引形式,这个groupby就不具备了,当然Tolookup还有一个强大的功能,就是使用
Func<TSource, TElement> elementSelector来对现在的v元素进行转换来避免我刚才 Console.WriteLine("\t\t" + item1.
TicketNo + " " + item1.Description);语句

好了,大概就这样了,赶紧停笔,不说了。。。妹子催着要去顾村公园。o(∩_∩)o
————————————————————————————————————————————————————————————
————————————————————————————————————————————————————————————
友情提示:如果不喜欢看文章,可以移步本系列的 C#IL解读完整视频 【一把伞的钱哦
】
————————————————————————————————————————————————————————————
————————————————————————————————————————————————————————————
挖一挖C#中那些我们不常用的东西之系列(1)——ToDictionary,ToLookup的更多相关文章
- 挖一挖C#中那些我们不常用的东西之系列(3)——StackTrace,Trim
时间太快了,三月又要过去了,告别一下...继续期待生死未卜的四月,今天我们继续挖一挖. 一: Environment.StackTrace 可能我们看到最多的就是catch中的e参数,里面会有一个St ...
- 挖一挖C#中那些我们不常用的东西之系列(2)——IsXXX 系列方法
不知道有人做没做过对日外包,如果做过的话,那么对vb.net应该非常熟悉了,当年我刚毕业的时候也做过四个月的外包,那种日子简直 不是人过的,就连大楼下面买珠宝的阿姨都说,这些孩子,只看过他们上班,就没 ...
- 挖一挖C#中那些我们不常用的东西之系列(5)——FlagAttribute
说到FlagsAttribute,源自前几天看到了一小段代码,大概意思就是根据航班政策来返回哪些配送方式是否可用,根据这些是否可用 来隐藏或者开启界面的相关配送方式,如果大家订过机票可能知道配送方式有 ...
- 挖一挖C#中那些我们不常用的东西之系列(4)——GetHashCode,ExpandoObject
这篇继续分享下GetHashCode和ExpandoObject这两个比较好玩的方法. 一:GetHashCode 从MSDN上可以看到的解释是:用作特定类型的哈希函数,也就是说任何对象的实例都会有一 ...
- 挖一挖不常用到而又很实用的重载-Trim
这个我想没有那个开发人员说不知道,但是里面有一个重载,这个不知道有多少开发人员知道! 可以看到,我可以去掉字符串前后的指定字符,只要我在char[]中指定即可,而不是仅仅去掉空格,这次为什么要提它,是 ...
- 挖一挖@Bean这个东西
有Bean得治 任何一个正常程序的访问都会在内存中创建非常多的对象,对象与对象之间还会出现很多依赖关系(一个处理业务逻辑的类中几乎都会使用到别的类的实例),一般的做法都是使用new关键字来创建对象,对 ...
- 挖一挖不常用到而又很实用的重载-Split
Split这个基本上所有的程序开发人员都用到,一般使用单字符和长字符串拆分字符串的较多,其实还有一个重载非常好用,那就是多种组合字符来进行拆分. 例如: "aaaaaaaaaa{@}bbbb ...
- ArcGIS案例学习笔记-批处理擦除挖空挖除相减
ArcGIS案例学习笔记-批处理擦除挖空挖除相减 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 目的:批处理擦除.挖空.挖除.相减 数据源:chp13/ex5/pa ...
- ArcGIS案例学习笔记-手动编辑擦除挖空挖除相减
ArcGIS案例学习笔记-手动编辑擦除挖空挖除相减 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 目的:手动编辑擦除.挖空.挖除.相减 1. 选中内部要素 2. c ...
随机推荐
- ScrollView与ListView冲突解决
正 常来说,在ScrollView添加一个ListView后在真机上只会显示ListView的一行多一点,我也不理解为什么会这样,后来我把 ListView的layout_height改成400dip ...
- EntityFramework中几种更改数据的方式
首先声明个实体类,该实体类是EntityFrameWork自动生成的,对应数据表Test结构如下 public partial class Test { public int Id{ get; set ...
- Asp.Net WebService 使用后来管理系统对接口方法进行公开控制
思路: 1.需要找一个访问Webservice的统一入口,刚开始进入了一个误区,以为WebService是单独的运行程序,后来经朋友提醒,其实它也是通过http请求在asp.net framework ...
- LeetCode122:Best Time to Buy and Sell Stock II
题目: Say you have an array for which the ith element is the price of a given stock on day i. Design a ...
- Yii2所提倡的配置管理方案
无意中看到Yii2提供的高级应用模板,里面将入口文件与环境相关配置项放到独立的目录下的相应文件中.这应该算是一种比较理想的应用配置管理方案了. 以前整理过一种思路:http://www.cnblogs ...
- Java并发编程:CountDownLatch、CyclicBarrier和Semaphore
Java并发编程:CountDownLatch.CyclicBarrier和Semaphore 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch ...
- 高性能 Windows Socket 组件 HP-Socket v3.0.2 正式发布
HP-Socket 是一套通用的高性能 Windows Socket 组件包,包含服务端组件(IOCP 模型)和客户端组件(Event Select 模型),广泛适用于 Windows 平台的 TCP ...
- Charted – 自动化的可视化数据生成工具
Charted 是一个让数据自动生成可视化图表的工具.只需要提供一个数据文件的链接,它就能返回一个美丽的,可共享的图表.Charted 不会存储任何数据.它只是获取和让链接提供的数据可视化. 在线演示 ...
- 今日推荐:10款在 Web 开发中很有用的占位图片服务
设计网站时,将要使用的图像在一开始通常还不存在,这个时候布局是最重要的.然而,图像的尺寸通常是预先设置,实用一些占位图像可以帮助我们更好地预览和分析布局. 如今,有免费的占位图片自动生成工具可以使用, ...
- slid.es – 创建在线幻灯片和演示文稿的最佳途径
slid.es 提供了一种创建在线幻灯片和演示文稿的简单方法,让你通过几个简单的步骤制作效果精美的在线演示文稿.基于 HTML5 和 CSS3 实现,在现代浏览器中效果最佳. 您可能感兴趣的相关文章 ...