C# 中奇妙的函数之ToL“.NET研究”ookup

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

  我将和大家一起来学学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.Cate上海企业网站制作gory == "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<string, Product> productsByCategory,string categoryName)
        {
            foreach (var item in productsByCategory[categoryName])
            {
                Console.WriteLine(item);
            }
        }

  结论

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

目录
相关文章
|
7月前
|
存储 算法 安全
如何控制上网行为——基于 C# 实现布隆过滤器算法的上网行为管控策略研究与实践解析
在数字化办公生态系统中,企业对员工网络行为的精细化管理已成为保障网络安全、提升组织效能的核心命题。如何在有效防范恶意网站访问、数据泄露风险的同时,避免过度管控对正常业务运作的负面影响,构成了企业网络安全领域的重要研究方向。在此背景下,数据结构与算法作为底层技术支撑,其重要性愈发凸显。本文将以布隆过滤器算法为研究对象,基于 C# 编程语言开展理论分析与工程实践,系统探讨该算法在企业上网行为管理中的应用范式。
230 8
|
7月前
|
存储 监控 算法
基于 C# 的局域网计算机监控系统文件变更实时监测算法设计与实现研究
本文介绍了一种基于C#语言的局域网文件变更监控算法,通过事件驱动与批处理机制结合,实现高效、低负载的文件系统实时监控。核心内容涵盖监控机制选择(如事件触发机制)、数据结构设计(如监控文件列表、事件队列)及批处理优化策略。文章详细解析了C#实现的核心代码,并提出性能优化与可靠性保障措施,包括批量处理、事件过滤和异步处理等技术。最后,探讨了该算法在企业数据安全监控、文件同步备份等场景的应用潜力,以及未来向智能化扩展的方向,如文件内容分析、智能告警机制和分布式监控架构。
215 3
|
7月前
|
存储 监控 算法
局域网上网记录监控的 C# 基数树算法高效检索方案研究
在企业网络管理与信息安全领域,局域网上网记录监控是维护网络安全、规范网络行为的关键举措。随着企业网络数据量呈指数级增长,如何高效存储和检索上网记录数据成为亟待解决的核心问题。基数树(Trie 树)作为一种独特的数据结构,凭借其在字符串处理方面的卓越性能,为局域网上网记录监控提供了创新的解决方案。本文将深入剖析基数树算法的原理,并通过 C# 语言实现的代码示例,阐述其在局域网上网记录监控场景中的具体应用。
185 7
|
8月前
|
SQL 小程序 API
如何运用C#.NET技术快速开发一套掌上医院系统?
本方案基于C#.NET技术快速构建掌上医院系统,结合模块化开发理念与医院信息化需求。核心功能涵盖用户端的预约挂号、在线问诊、报告查询等,以及管理端的排班管理和数据统计。采用.NET Core Web API与uni-app实现前后端分离,支持跨平台小程序开发。数据库选用SQL Server 2012,并通过读写分离与索引优化提升性能。部署方案包括Windows Server与负载均衡设计,确保高可用性。同时针对API差异、数据库老化及高并发等问题制定应对措施,保障系统稳定运行。推荐使用Postman、Redgate等工具辅助开发,提升效率与质量。
343 0
|
10月前
|
C#
C# 中关于补位的写法 PadLeft,PadRight 函数
C# 中的 `PadLeft` 和 `PadRight` 是 String 类提供的用于字符串补位的实用方法。`PadLeft` 在字符串左侧填充指定字符,使其达到指定长度;`PadRight` 则在右侧填充。两者通过检查原字符串长度,计算需填充字符数,并创建新字符数组完成操作。时间复杂度为 O(n),适用于简单补位场景,但在大量操作时需注意性能影响。示例代码展示了如何使用这两个方法进行补位操作。
|
12月前
|
开发框架 搜索推荐 算法
一个包含了 50+ C#/.NET编程技巧实战练习教程
一个包含了 50+ C#/.NET编程技巧实战练习教程
365 18
|
10月前
|
人工智能 机器人
D1net阅闻 | 谷歌DeepMind研究发现LLM新特性
D1net阅闻 | 谷歌DeepMind研究发现LLM新特性
|
12月前
|
缓存 算法 安全
精选10款C#/.NET开发必备类库(含使用教程),工作效率提升利器!
精选10款C#/.NET开发必备类库(含使用教程),工作效率提升利器!
419 12
|
12月前
|
开发框架 人工智能 .NET
C#/.NET/.NET Core拾遗补漏合集(24年12月更新)
C#/.NET/.NET Core拾遗补漏合集(24年12月更新)
194 6
|
12月前
|
开发框架 算法 .NET
C#/.NET/.NET Core技术前沿周刊 | 第 15 期(2024年11.25-11.30)
C#/.NET/.NET Core技术前沿周刊 | 第 15 期(2024年11.25-11.30)
208 6