ToDictionary,ToLookup
这个系列我们看看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的更多相关文章
- 挖一挖C#中那些我们不常用的东西之系列(1)——ToDictionary,ToLookup
这个系列我们看看C#中有哪些我们知道,但是又不知道怎么用,又或者懒得去了解的东西,比如这篇我们要介绍的toDictionary 和ToLookup. 从图中我们看到有四个ToXXX的方法,其中ToAr ...
- c# 敏捷2 ForEach ToDictionary ToLookup Except比较
using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; ...
- 挖一挖C#中那些我们不经常使用的东西之系列(1)——ToDictionary,ToLookup
这个系列我们看看C#中有哪些我们知道.可是又不知道怎么用.又或者懒得去了解的东西,比方这篇我们要介绍的toDictionary 和ToLookup. 从图中我们看到有四个ToXXX的方法,当中ToAr ...
- Linq常用查询运算符
Linq一共包含五十几个查询运算符,常用的根据类型来区分一共有5类左右,这五类里面一些事在项目查询中经常用到的.不过linq运算符的命名十分规范,基本从字面意思就能猜测出来是干嘛用的,下面我们挑选一些 ...
- C#经典系列-键值对
1.ToDictionary,ToLookup 从图中我们看到有四个ToXXX的方法,其中ToArray和ToList,用的是非常非常多 我们有这样的一个实体 class student { publ ...
- 再次理解 C# LINQ
语言集成查询 (LINQ) 是一系列直接将查询功能集成到 C# 语言的技术统称. 查询表达式(生成表达式) 1.IEnumerable<T> 查询编译为委托.如 source.Where( ...
- C#(少用的)
挖一挖C#中那些我们不常用的东西之系列(1)——ToDictionary,ToLookup 挖一挖C#中那些我们不常用的东西之系列(2)——IsXXX 系列方法 挖一挖C#中那些我们不常用的东西之系列 ...
- 23LINQ运算符返回其它类型实例汇总
IEnumerable<T>返回其它集合类型 ToArray() ToList() ToDictionary() ToLookUp() 返回集合中的元素 □ ElementAt ...
- LINQ标准查询操作符(四) —AsEnumerable,Cast,OfType,ToArray,ToDictionary,ToList,ToLookup,First,Last,ElementAt
十.转换操作符 转换操作符是用来实现将输入对象的类型转变为序列的功能.名称以“As”开头的转换方法可更改源集合的静态类型但不枚举(延迟加载)此源集合.名称以“To”开头的方法可枚举(即时加载)源集合并 ...
随机推荐
- About View
View Geometry Frame & Bounds Graphically, a view can be regarded as a framed canvas. The frame l ...
- String创建对象的个数--西北狼
public class StringDemo { /** * @param args */ public static void main(String[] args) { // TODO Auto ...
- Android res/raw vs assets
common: 1.两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制. difference: 1.res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源I ...
- hd oj2025
Ps:尼玛这道题简直坑爹...就是直接比较ascii码....无脑题,想复杂了... 代码:#include "stdio.h"#include "string.h&qu ...
- 2016-1-9 Quartz框架的学习,剪裁图片并设置边框
#import "ViewController.h" @interface ViewController () @end @implementation ViewControlle ...
- 针对电信乌龙事件的深度测试: 广州电信错误将深圳地区189的号码在3G升级4G申请时从广州网厅发货,造成深圳用户收到4G卡后无法激活,深圳电信找不到订单
广州电信错误将深圳地区189的3G升级4G申请从中国电信广州网厅发货(智能卡号:8986 1114 9002 0851 742X S 电话号码 189),造成用户收到4G卡后无法激活,深圳电信找不 ...
- 嵌入式 -- WINKHUB 边信道攻击 (NAND Glitch)
0x00 前言 随着物联网IOT的飞速发展,各类嵌入式设备, 路由器安全研究也越来越火. 但因为跟以往纯软件安全研究的要求不同, 这类研究往往需要结合相应的硬件知识. 很多朋友困惑如何开始, 甚至卡在 ...
- ios开发之触碰动画效果
步骤:1.使用singe view application创建新的项目 2.在viewcontroller.h文件中定义两张图片的实例对象,创建一个UIDynamicAnimator实例对象,添加一个 ...
- Koch曲线
Koch曲线是一种分形,完整的Koch曲线像雪花,维基百科上记录Koch曲线最早出现在海里格·冯·科赫的论文<关于一条连续而无切线,可由初等几何构作的曲线>中,它的定义如下,给定线段AB, ...
- PIT,BL,AP,CP,CSC
使用ODIN刷机的时候,要选择ROM文件,以下是5件套各部分的说明: PIT:分区信息,如果没有更换ROM,一般不需要刷,也不需要勾选re-partition选项 BL:bootloader,引导信息 ...