这个系列我们看看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. html练习——个人简介

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. 《Head First设计模式(中文版)》

    <Head First设计模式(中文版)>共有14章,每章都介绍了几个设计模式,完整地涵盖了四人组版本全部23个设计模式.前言先介绍<Head First设计模式(中文版)>的 ...

  3. mycat启动后,用Navicat Premium 连接报 "2013"

    最近在学习mycat,启动后,用Navicat Premium 连接报 "2013"  Lost Connection During Query ,经过一顿百度也没发现是怎么回事, ...

  4. shell脚本入门教程(转)

    http://bbs.chinaunix.net/thread-391751-1-1.html http://www.cnblogs.com/suyang/archive/2008/05/18/120 ...

  5. HDU5441 Travel 并查集

    http://acm.hdu.edu.cn/showproblem.php?pid=5441 无向图,n个点,m条带权边,q次询问,给出数值d,点a可以到点b当且仅当存在一条路线其中最大的权值不超过d ...

  6. nginx下面部署fast-cgi和C++【原】

    1.cgi文件的代码 #include "fcgi_stdio.h" #include <stdlib.h> #include <stdio.h> int ...

  7. Redis 设计与实现读书笔记一 Redis List

    list结构体 adlist.h/list(源码位置) /* * 双端链表结构 */ typedef struct list { // 表头节点 listNode *head; // 表尾节点 lis ...

  8. 尽量多的以 const/enum/inline 替代 #define

    前言 在面向过程语言,如 C 语言中,#define 非常常见,也确实好用,值得提倡.但在如今面向对象的语言,如 C++ 语言中,#define 就要尽量少用了. 为何在 C++ 中就要少用了呢? 这 ...

  9. Eclipse 安装 CDT

    最近准备开始重新学C++,先从IDE开始准备起 Ubuntu下安装非常简单: 打开Eclipse: help -> Install new software ->  http://down ...

  10. dalvik虚拟内存管理之三——调试信息

    转载自http://www.miui.com/thread-75063-1-1.html 1. verbosegc一般Java虚拟机要求支持verbosegc选项,输出详细的垃圾收集调试信息.dalv ...