这个系列我们看看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的更多相关文章

  1. 挖一挖C#中那些我们不常用的东西之系列(3)——StackTrace,Trim

    时间太快了,三月又要过去了,告别一下...继续期待生死未卜的四月,今天我们继续挖一挖. 一: Environment.StackTrace 可能我们看到最多的就是catch中的e参数,里面会有一个St ...

  2. 挖一挖C#中那些我们不常用的东西之系列(2)——IsXXX 系列方法

    不知道有人做没做过对日外包,如果做过的话,那么对vb.net应该非常熟悉了,当年我刚毕业的时候也做过四个月的外包,那种日子简直 不是人过的,就连大楼下面买珠宝的阿姨都说,这些孩子,只看过他们上班,就没 ...

  3. 挖一挖C#中那些我们不常用的东西之系列(5)——FlagAttribute

    说到FlagsAttribute,源自前几天看到了一小段代码,大概意思就是根据航班政策来返回哪些配送方式是否可用,根据这些是否可用 来隐藏或者开启界面的相关配送方式,如果大家订过机票可能知道配送方式有 ...

  4. 挖一挖C#中那些我们不常用的东西之系列(4)——GetHashCode,ExpandoObject

    这篇继续分享下GetHashCode和ExpandoObject这两个比较好玩的方法. 一:GetHashCode 从MSDN上可以看到的解释是:用作特定类型的哈希函数,也就是说任何对象的实例都会有一 ...

  5. 挖一挖不常用到而又很实用的重载-Trim

    这个我想没有那个开发人员说不知道,但是里面有一个重载,这个不知道有多少开发人员知道! 可以看到,我可以去掉字符串前后的指定字符,只要我在char[]中指定即可,而不是仅仅去掉空格,这次为什么要提它,是 ...

  6. 挖一挖@Bean这个东西

    有Bean得治 任何一个正常程序的访问都会在内存中创建非常多的对象,对象与对象之间还会出现很多依赖关系(一个处理业务逻辑的类中几乎都会使用到别的类的实例),一般的做法都是使用new关键字来创建对象,对 ...

  7. 挖一挖不常用到而又很实用的重载-Split

    Split这个基本上所有的程序开发人员都用到,一般使用单字符和长字符串拆分字符串的较多,其实还有一个重载非常好用,那就是多种组合字符来进行拆分. 例如: "aaaaaaaaaa{@}bbbb ...

  8. ArcGIS案例学习笔记-批处理擦除挖空挖除相减

    ArcGIS案例学习笔记-批处理擦除挖空挖除相减 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 目的:批处理擦除.挖空.挖除.相减 数据源:chp13/ex5/pa ...

  9. ArcGIS案例学习笔记-手动编辑擦除挖空挖除相减

    ArcGIS案例学习笔记-手动编辑擦除挖空挖除相减 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 目的:手动编辑擦除.挖空.挖除.相减 1. 选中内部要素 2. c ...

随机推荐

  1. 【C#】第2章学习要点

    分类:C#.VS2015 创建日期:2016-06-15 教材:(十二五国家级规划教材)<C#程序设计及应用教程>(第3版) 一.本章要点 C#数据类型分两大类:值类型.引用类型. 值类型 ...

  2. sina sae开发中出现的问题

    都是些小问题,但既然出现了,下次就该避免! 网站加载速度慢: 1.安装 Disable Google Fonts 字体插件即可  2.删代码 http://jingyan.baidu.com/arti ...

  3. JAVA中的输入方法

    输入整数(int)类型 导入包 import java.io.*; 输入语句 BufferedReader myIn=new BufferedReader(new inputStreamReader( ...

  4. Js 风骚的代码

    1.写自动调用的匿名函数 当我们写完一个函数立即调用时,总是 function a(){ } a(); 或许 var a = function(){ } a(); 而高手总是 (function(){ ...

  5. jinfo命令的使用

    jinfo命令 该命令可以打印出java进程的配置信息:包括jvm参数,系统属性等用法: jinfo [ option ] pid jinfo [ option ] executable core j ...

  6. Python的sorted函数应用

    sorted()函数也是一个高阶函数,它还可以接收一个key函数来实现自定义的排序 L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88) ...

  7. Nuget很慢,我们该怎么办

    在VS中给项目添加程序已经采用NuGet 十分方便 不过很多时候速度很慢,一直显示“正在检索信息” 其实直接使用程序包管理控制台,速度就会好很多 如果命令不太会写,安装包名不是确认,可以先登录 htt ...

  8. ecshop适应PHP7的修改

    说实话,ecshop这个系统,到目前也没见怎么推出新版本,如果是新项目,不太建议使用它.不过,因为我一直以来都在使用中,所以不得不更改让其适应PHP新版本.现在PHP 7已经出发行版了,所以更改来继续 ...

  9. 玩转Docker之常用命令篇(三)

    首先我们来解决一个小问题,使用docker每次都要用sudo,为了让非root用户使用docker,可将当前用户添加到docker用户组: sudo groupadd docker sudo gpas ...

  10. Aurelia – 模块化,简单,可测试的 JS 框架

    Aurelia 是下一代 JavaScript 客户端框架,利用简单的约定来激发你的创造力.凭借其强大的专注于开发经验, Aurelia 可以使您不仅创造惊人的应用程序,同时也享受这个过程.它经过精心 ...