博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# ToLookup
阅读量:5844 次
发布时间:2019-06-18

本文共 3514 字,大约阅读时间需要 11 分钟。

下文参考翻译自:

故事的背景

让我们先来创建一个简单的类来表示产品,产品有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
GetList() { var products = new List
{ 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 property                Console.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
productsByCategory,string categoryName) { foreach (var item in productsByCategory[categoryName]) { Console.WriteLine(item); } }
你可能感兴趣的文章
pycharm工具下代码下面显示波浪线的去处方法
查看>>
C#高级编程9 第17章 使用VS2013-C#特性
查看>>
java集合类
查看>>
对软件工程这门课的收获与总结
查看>>
转:shell awk
查看>>
磁盘与目录的容量(转)
查看>>
【转】OpenGL超级宝典笔记——纹理映射Mipmap
查看>>
【SpringBoot】在IOC之外的类中使用IOC内部的Bean
查看>>
android--Activity有返回值的跳转
查看>>
Fiddle:使用断点:bpu,bpafter
查看>>
一个js的动画,以前以为只有flash可以实现
查看>>
使用onclick跳转到其他页面。使用button跳转到指定url
查看>>
CentOS搭建Sqoop环境
查看>>
suse linux ssh远程无法访问问题
查看>>
HDU 5673 Robot 卡特兰数
查看>>
只显示标准采购订单
查看>>
只允许操作外协任务
查看>>
Python--day60--一个简单(不完整)的web框架
查看>>
一些服务器编程的概念
查看>>
scjp jdk1.5 ——4.19(6)
查看>>