这个系列我们看看C#中有哪些我们知道,但是又不知道怎么用,又或者懒得去了解的东西,比如这篇我们要介绍的toDictionary
和ToLookup。   从图中我们看到有四个ToXXX的方法,其中ToArray和ToList,我想大家用的是非常非常多,但是ToDictionary和ToLookup
不见得有多少人用了,但不能否认的是这些方法确实很有用。
不多废话了,直接如主题,我们有这样的一个实体,包含:票号,订单号,备注。
按 Ctrl+C 复制代码
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);语句

ToDictionary,ToLookup的更多相关文章

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

    这个系列我们看看C#中有哪些我们知道,但是又不知道怎么用,又或者懒得去了解的东西,比如这篇我们要介绍的toDictionary 和ToLookup. 从图中我们看到有四个ToXXX的方法,其中ToAr ...

  2. c# 敏捷2 ForEach ToDictionary ToLookup Except比较

    using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; ...

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

    这个系列我们看看C#中有哪些我们知道.可是又不知道怎么用.又或者懒得去了解的东西,比方这篇我们要介绍的toDictionary 和ToLookup. 从图中我们看到有四个ToXXX的方法,当中ToAr ...

  4. Linq常用查询运算符

    Linq一共包含五十几个查询运算符,常用的根据类型来区分一共有5类左右,这五类里面一些事在项目查询中经常用到的.不过linq运算符的命名十分规范,基本从字面意思就能猜测出来是干嘛用的,下面我们挑选一些 ...

  5. C#经典系列-键值对

    1.ToDictionary,ToLookup 从图中我们看到有四个ToXXX的方法,其中ToArray和ToList,用的是非常非常多 我们有这样的一个实体 class student { publ ...

  6. 再次理解 C# LINQ

    语言集成查询 (LINQ) 是一系列直接将查询功能集成到 C# 语言的技术统称. 查询表达式(生成表达式) 1.IEnumerable<T> 查询编译为委托.如 source.Where( ...

  7. C#(少用的)

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

  8. 23LINQ运算符返回其它类型实例汇总

      IEnumerable<T>返回其它集合类型 ToArray() ToList() ToDictionary() ToLookUp()     返回集合中的元素 □ ElementAt ...

  9. LINQ标准查询操作符(四) —AsEnumerable,Cast,OfType,ToArray,ToDictionary,ToList,ToLookup,First,Last,ElementAt

    十.转换操作符 转换操作符是用来实现将输入对象的类型转变为序列的功能.名称以“As”开头的转换方法可更改源集合的静态类型但不枚举(延迟加载)此源集合.名称以“To”开头的方法可枚举(即时加载)源集合并 ...

随机推荐

  1. 《Java程序性能优化:让你的Java程序更快、更稳定》

    Java程序性能优化:让你的Java程序更快.更稳定, 卓越网更便宜,不错的书吧

  2. poj2769 暴力

    //Accepted 208 KB 157 ms //纯暴力 //vis数组初始化时要用多少设置多少,不然TLE #include <cstdio> #include <cstrin ...

  3. Non-constant Fields in Case Labels

    Non-constant Fields in Case Labels in android library project http://tools.android.com/tips/non-cons ...

  4. C++除法取整

    使用floor函数.floor(x)返回的是小于或等于x的最大整数.如:     floor(2.5) = 2 floor(-2.5) = -3 使用ceil函数.ceil(x)返回的是大于x的最小整 ...

  5. Swift URL Schemes使用

    URL Schemes通常用于分享和第三方登录,但有时需要在html跳至APP,或者APP跳至另外一个APP.这时也需要使用URL Schemes. 一.html跳转至APP eg:html跳转至te ...

  6. jquery模拟淘宝购物车

    今天要实现的一个功能页面就是利用jquery代码模拟一个淘宝网的购物车结算页面 总体页面效果如图: 首先我们要实现的内容的需求有如下几点: 1.在购物车页面中,当选中“全选”复选框时,所有商品前的复选 ...

  7. MapBox TileMill

    TileMill 学习网站: Walkthrough: Creating tiles with Mapnik using TileMill TileMill 快速入门 Cartography With ...

  8. 如何用 freebayes call SNP

    1,软件介绍 FreeBayes is a Bayesian genetic variant detector designed to find small polymorphisms, specif ...

  9. 关于环境变量PATH的几点注意事项

    查看执行文件路径变量PATH的内容可用echo $PATH.echo表示显示打印之意,$表示后接的是变量. 如下图所示,其中每个目录中间用冒号(:)来隔开,每个目录是有顺序之分的: 如果预修改PATH ...

  10. CentOS7上安装和使用Docker

    导读 Docker 是一个开源工具,它可以让创建和管理 Linux 容器变得简单,容器就像是轻量级的虚拟机,并且可以以毫秒级的速度来启动或停止.在本篇文章中我们将教你如何在 CentOS 7.x 中安 ...