走进C#奇妙函数之ToLookup

开发 后端
C#奇妙函数,顾名思义就是在C#大家不长见、不长用的一些函数。没见过不等于不好用,大家还是一起来学习下吧。

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

好的!先来看看ToLookup:

故事的背景

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

  1. public sealed class Product  
  2.  
  3.    public int Id { getset; }  
  4.    public string Category { getset; }  
  5.    public double Value { getset; }  
  6.     
  7.  
  8.    public override string ToString()  
  9.    {  
  10.        return string.Format("[{0}: {1} - {2}]", Id, Category, Value);  
  11.    }  

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

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

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

  1. foreach (var group in products.GroupBy(p => p.Category))  
  2.  
  3.    Console.WriteLine(group.Key);  
  4.    foreach (var item in group)  
  5.    {  
  6.        Console.WriteLine("\t" + item);  
  7.    }  


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

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

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

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

  1.  var groups = products.GroupBy(p => p.Category);  
  2. //删除所有属于Garden的产品  
  3. products.RemoveAll(p => p.Category == "Garden");  
  4.  
  5. foreach (var group in groups)  
  6. {  
  7.     Console.WriteLine(group.Key);  
  8.     foreach (var item in group)  
  9.     {  
  10.         Console.WriteLine("\t" + item);  
  11.     }  

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

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

ToLookup登场

现在我们有请ToLookup。

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

  1.  var productsByCategory = products.ToLookup(p => p.Category);  
  2.  
  3.  foreach (var group in productsByCategory)  
  4. {  
  5.     // the key of the lookup is in key property  
  6.     Console.WriteLine(group.Key);  
  7.     // the list of values is the group itself.  
  8.     foreach (var item in group)  
  9.     {  
  10.         Console.WriteLine("\t" + item);  
  11.     }  

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

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


结论

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

原文链接:http://www.cnblogs.com/multiplesoftware/archive/2011/03/31/2000528.html

【编辑推荐】

  1. C#取整函数实例应用详解
  2. C#单元测试的一个小故事
  3. C#单元测试使用的必要性的浅析
  4. C#单元测试概念及作用的浅析
  5. C#单元测试的运行浅析

【责任编辑:彭凡 TEL:(010)68476606】

责任编辑:彭凡 来源: 博客园
相关推荐

2011-04-26 08:56:31

C#

2024-01-23 10:13:57

C++虚函数

2009-08-31 10:14:49

C# CreateEm

2009-08-31 09:59:13

C# CreateEm

2009-08-31 10:28:00

C# CreateEm

2019-11-29 09:30:37

Three.js3D前端

2009-07-31 14:26:38

JavaScript函C#函数

2009-08-25 17:59:49

C#入门

2009-07-30 15:24:13

C#析构函数C#构造函数

2009-08-10 14:43:03

C#函数Convert

2009-07-31 14:08:54

C# 匿名函数

2009-08-19 14:26:58

C# JavaScri

2009-07-31 16:00:30

C#函数重载

2009-07-31 14:54:48

dll函数C#导出

2009-08-24 18:09:13

C#构造函数

2009-07-31 14:15:38

C# 构造函数

2009-07-31 14:03:21

C# Format函数

2024-02-26 18:23:29

C++封装代码

2009-08-25 16:32:24

C#语言

2021-03-15 08:18:23

C#反射模块
点赞
收藏

51CTO技术栈公众号