我将和大家一起来学学C#中一些非常有用函数,对于有些人来说可能它们不起眼,因此常常忽略它们。它们不会嚷嚷到:使用我吧!我会让你节省很多的时间,而且让你的代码变得更加的简洁! -- 但是,这些话会从对它们熟悉的程序员的脑海中涌现出来。

  好的!先来看看ToLookup:

  故事的背景

  让我们先来创建一个简单的类来表示产品,产品有ID,类别,和价格,这个类没有什么特别:

      public sealed class Product{public int Id { get; set; }public string Category { get; set; }public double Value { get; set; }public override string ToString(){return string.Format("[{0}: {1} - {2}]", Id, Category, Value);}}

  然后我们加入一个函数得到一个产品的列表,当然你也可以从数据库中读取出来:

        public static List<Product> GetList(){var products = new List<Product>{new Product {Id = 1, Category = "Electronics", Value = 15.0},new Product {Id = 2, Category = "Groceries", Value = 40.0},new Product {Id = 3, Category = "Garden", Value = 210.3},new Product {Id = 4, Category = "Pets", Value = 2.1},new Product {Id = 5, Category = "Electronics", Value = 19.95},new Product {Id = 6, Category = "Pets", Value = 21.25},new Product {Id = 7, Category = "Pets", Value = 5.50},new Product {Id = 8, Category = "Garden", Value = 13.0},new Product {Id = 9, Category = "Automotive", Value = 10.0},new Product {Id = 10, Category = "Electronics", Value = 250.0},};return products;}

  我们有一个任务就是按类别列出一个物品清单,这个非常的容易,用GroupBy 就可以实现了:

             foreach (var group in products.GroupBy(p => p.Category)){Console.WriteLine(group.Key);foreach (var item in group){Console.WriteLine("\t" + item);}}

  看起来一切都很好,没有什么问题.

  当我们使用 GroupBy() 扩展方法时,使用了延迟执行。 这意味着,当你遍历集合的时候,下一个要出现的项目可能会或者可能不会被加载。 这是一个很大的性能改进,但它会引起有趣的副作用。

  在用 GroupBy()时,  它实际上是在第一项被使用的时候创建分组,而不是在 GroupBy() 第一次被调用时。

  考虑一下:如果你从数据库中加载数据,然后想组合到一起,并存储快速查找。  看下面的一段代码:

             var groups = products.GroupBy(p => p.Category);//删除所有属于Garden的产品products.RemoveAll(p => p.Category == "Garden");foreach (var group in groups){Console.WriteLine(group.Key);foreach (var item in group){Console.WriteLine("\t" + item);}}

  执行后发现,所有的Garden产品都已经消失了,但是 groups 是在执行删除命令前就已经赋值了。

  基于这种情况,我们不得不使用ToDictionary() 将GroupBy 后的结果储存起来,这样一来工作量就增加了,而且维护也不太方便 -- 请大家试试。

  ToLookup登场

  现在我们有请ToLookup。

  该 ToLookup() 方法创建一个类似 字典(Dictionary ) 的列表List, 但是它是一个新的 .NET Collection 叫做 lookup。 Lookup,不像Dictionary, 是不可改变的。 这意味着一旦你创建一个lookup, 你不能添加或删除元素。

             var productsByCategory = products.ToLookup(p => p.Category);

             foreach (var group in productsByCategory){// the key of the lookup is in key propertyConsole.WriteLine(group.Key);// the list of values is the group itself.foreach (var item in group){Console.WriteLine("\t" + item);}}

  你还可以使用类似索引的功能得到某个项目,在本案例中是得到某个类别的所有产品:

         private static void PrintCategory(ILookup<string, Product> productsByCategory,string categoryName){foreach (var item in productsByCategory[categoryName]){Console.WriteLine(item);}}

  结论

  ToLookup() 是一个奇妙的函数,用于对一个集合进行操作,创建一个1:n 的映射。 它可以方便的将数据分类成组,并生成一个字典供查询使用。

转载于:https://www.cnblogs.com/waw/archive/2011/09/01/2162903.html

一起谈.NET技术,C# 中奇妙的函数之ToLookup相关推荐

  1. C# 中奇妙的函数 -- 1. ToLookup

    这个系列,我和大家一起来学学C#中一些非常有用函数,对于有些人来说可能它们不起眼,因此常常忽略它们.它们不会嚷嚷到:"使用我吧!我会让你节省很多的时间,而且让你的代码变得更加的简洁!&quo ...

  2. C# 中奇妙的函数–6. 五个序列聚合运算(Sum, Average, Min, Max,Aggregate)

    今天,我们将着眼于五个用于序列的聚合运算.很多时候当我们在对序列进行操作时,我们想要做基于这些序列执行某种汇总然后,计算结果. Enumerable 静态类的LINQ扩展方法可以做到这一点 .就像之前 ...

  3. 技术思考:也谈知识图谱平台中的数据流程与构建范式思考

    笔者之前写过一篇文章<关于知识图谱标准化构建平台的思考:知识图谱只能做项目,不能做平台?>,地址:https://blog.csdn.net/lhy2014/article/details ...

  4. 浅谈数字媒体艺术中的技术应用-3-工具介绍(二)

    上一篇文章介绍了数据可视化工具Processing和OpenFrameWorks,以及开源电子硬件Arduino和RaspberryPI.这一篇继续把剩下的几个工具进行逐一的介绍. 商用游戏引擎:Un ...

  5. 计算机技术在现代地球科学中的重要性,浅谈GIS技术在地球科学中的应用.doc

    浅谈GIS技术在地球科学中的应用.doc 浅谈GIS技术在地球科学中的应用 中图分类号:P9 文献标识码:A 文章编号:1007-0745(2014)02-0181-01 摘要:地理信息系统是指带各种 ...

  6. 浅谈BIM技术在“智慧工地”建设中的应用

    浅谈BIM技术在"智慧工地"建设中的应用 随着信息技术的不断发展,建筑行业的信息化程度不断提高,BIM技术在建设行业得到了广泛的推广和应用,同时,伴随着大数据时代的到来,智慧城市的 ...

  7. 《浅谈条形码技术在连锁超市中的应用》论文笔记(二)

    一.基本信息 标题:浅谈条形码技术在连锁超市中的应用 时间:2016 来源:品牌(西京学院) 关键词:条形码技术; 连锁超市; 条码的应用; 二.研究内容 1.问题定义: 条形码作为一项以计算机技术和 ...

  8. 浅谈数字媒体艺术中的技术应用-1-技术概述

    这个是我近期在某个大学做的讲座,主要针对的是数字媒体艺术专业的大一-大三的学生,大概听讲座的有100个学生,老师有6-8个.主要讲述了数字媒体艺术专业的同学不熟悉的计算机技术,但是他们到做毕设的时候确 ...

  9. 计算机动画 vr技术应用,浅谈VR技术在动画专业教学中的运用

    摘要:VR技术是网络计算机技术快速发展背景下衍生的新技术,其以计算机为载体,能够对复杂数据进行高效的交互和可视化操作,当前,VR技术逐渐向教育领域延伸,作为一种新的教学技术具有非常广阔的前景.本文以V ...

最新文章

  1. 读博无门,就业碰壁,孤独当了7个月“民科”后,他的论文中了顶会
  2. IOS贝塞尔曲线圆形进度条和加载动画
  3. php在双引号中输出变量要加大括号,php中输出变量加大括号{}作用_PHP教程
  4. C语言再学习 -- 位、字节、字、字长、字元的关系
  5. 音视频技术开发周刊 | 174
  6. C++空类和string类
  7. 丘成桐现身合肥分享发现数学之美 点赞中国科大年轻学子
  8. 安装不成功_iOS12.4.1 安装失败?教你百分百不掉签
  9. jdbc连接oracle数据库
  10. Java中的变量Variable
  11. Qt之利用事件过滤器在QLabel上画框
  12. matlab2013a文件安装密钥,Matlab2013a软件安装教程
  13. Delphi基础教程图文版之数组
  14. 三星mega2 android os,三星G7508Q (Galaxy Mega 2 双4G)一键救砖教程,轻松刷回官方系统...
  15. java代码-zip解压不可预料的压缩文件末端一级压缩包中的文件为0kb以及目录创建流会报错
  16. 基于AR眼镜有哪类功能可实现?
  17. tipask二次开发总结_tipask二次开发总结
  18. 汇承金融科技:开创多渠道资产与资金撮合融资服务模式
  19. 2021-01 补丁日:Oracle多个产品漏洞安全风险通告
  20. 年已过,新的一年如何过?

热门文章

  1. flask运行多个服务器,与Flask服务器同时运行while循环
  2. linux系统里常用的抓图工具,Linux系统下屏幕截图常用方法
  3. oracle where in优化,【求助】为什么在where过滤条件中使用in这样子查询后速度变的非常慢?!...
  4. python实现数据恢复_使用sklearn进行对数据标准化、归一化以及将数据还原的方法...
  5. 表单提交时submit验证非空return false没用_开发这样一个复杂的表单你需要用多久...
  6. sqoop2 java api实现_Sqoop2 Java客户端API指南
  7. 计算机二级ms office过关,计算机二级office-计算机二级MS OFFICE过关攻略!附赠练习软件...
  8. mysql 每条记录大小_计算数据库中各个表的数据量和每行记录所占用空间
  9. django开发个人博客
  10. C#超市管理系统试题