《Effective C#》读书笔记——条目8:推荐使用查询语法而不是循环<C#语言习惯>

简介:

 查询语法(query syntax)可以让程序逻辑的表达由“命令式”转换为“声明式”。查询语法定义了想要的结果,而把具体实现交给其他的专门实现。使用查询语法(实现了查询表达式模式的方法语法也可以)要比传统的命令式循环结果更加清晰的表达你的意图。

  下面我们观察一个使用命令式方法填充一个数组,然后将其内容输出至控制台:

复制代码
 1   static void Main(string[] args)
 2         {
 3             int[] foo = new int[100];
 4             for (int num = 0; num < foo.Length; num++)
 5             {
 6                 foo[num] = num * num;
 7             }
 8             foreach (int i in foo)
 9             {
10                 Console.WriteLine(i);
11             }
12             Console.Read();
13         }
复制代码

 

编写命令式的代码需要关注具体的实现细节。但是如果采用查询语法,实现同样的功能,代码更加易于重用且易读,我们来看上面示例“声明式”的写法:

复制代码
 1   static void Main(string[] args)
 2         {
 3             //生成数组的工作交个一个查询完成
 4             int[] foo = (from n in Enumerable.Range(0, 100) select n * n).ToArray();
 5 
 6             //循环打印的工作交给一个数组的扩展方法来完成
 7             foo.ForAll((n) => Console.WriteLine(n.ToString()));
 8 
 9             Console.Read();
10         }
复制代码

我们看到在负责循环打印部分我们使用了一个扩展方法,这个扩展方法带来了更好的重用性,每次需要对一个序列的元素执行某个操作都可以使用ForAll()方法:

复制代码
 1 public static class Extensions
 2 {
 3     /// <summary>
 4     /// 为IEnumerable<T>类型添加扩展方法
 5     /// </summary>
 6     /// <typeparam name="T"></typeparam>
 7     /// <param name="sequence"></param>
 8     /// <param name="action"></param>
 9     public static void ForAll<T>(this IEnumerable<T> sequence, Action<T> action)
10     {
11         foreach (T item in sequence)
12         {
13             action(item);
14         }
15     }
16 }
复制代码

 

上面的实例比较简单,似乎看不出二者有多大的区别,在下面的实例中我们分别使用“命令式”和“声明式”来实现比较二者的区别 。

命令式:

View Code

 

声明式:

View Code

 我们可以看到随着编程任务的复杂:

  “命令式”版本变得越来越难以理解。如果仔细看的话,甚至都不会发现比较函数中参数被颠倒了(这是个错误),而这只是为了能够降序排列而已。要是没有任何注释和稳定,命令式代码将会更加难以阅读。”命令式“代码太过于强调实现目标所需要的详细步骤,以至于让人很容易陷入具体的细节中。

  “声明式”版本的最后一个实现,实际只是将以此过滤(where子句)、以此排序(orderby子句)和一个投射(select)组合起来。查询语法比循环结构能够提供更具组合性的API。查询语法很自然的将算法分解成小块代码,每一块代码静对序列中的元素进行单一操作。查询语法的延迟执行模式也让开发者能够将这些单一的操作组合成多步的操作,且只要一次遍历序列就可以完整执行,而循环语法结构则必须为每一步操作都创建临时的存储,或者为序列将要执行的每一批操作都创建专用的方法。

 

小节:

当你需要编写循环时,首先看看能否用查询语法实现,若是无法使用查询语法,那么再看看是否能以方法调用语法替代。这样写出的代码总会比命令式循环结构要简洁一些。

本文转自gyzhao博客园博客,原文链接:http://www.cnblogs.com/IPrograming/archive/2012/09/01/Effective_CSharp_08.html ,如需转载请自行联系原作者
相关文章
|
SQL 数据库 C#
C# .NET面试系列十一:数据库SQL查询(附建表语句)
#### 第1题 用一条 SQL 语句 查询出每门课都大于80 分的学生姓名 建表语句: ```sql create table tableA ( name varchar(10), kecheng varchar(10), fenshu int(11) ) DEFAULT CHARSET = 'utf8'; ``` 插入数据 ```sql insert into tableA values ('张三', '语文', 81); insert into tableA values ('张三', '数学', 75); insert into tableA values ('李四',
395 2
C# .NET面试系列十一:数据库SQL查询(附建表语句)
|
9月前
|
存储 机器学习/深度学习 监控
网络管理监控软件的 C# 区间树性能阈值查询算法
针对网络管理监控软件的高效区间查询需求,本文提出基于区间树的优化方案。传统线性遍历效率低,10万条数据查询超800ms,难以满足实时性要求。区间树以平衡二叉搜索树结构,结合节点最大值剪枝策略,将查询复杂度从O(N)降至O(logN+K),显著提升性能。通过C#实现,支持按指标类型分组建树、增量插入与多维度联合查询,在10万记录下查询耗时仅约2.8ms,内存占用降低35%。测试表明,该方案有效解决高负载场景下的响应延迟问题,助力管理员快速定位异常设备,提升运维效率与系统稳定性。
372 4
|
开发框架 .NET API
以C#一分钟浅谈:GraphQL 数据类型与查询
本文从C#开发者的角度介绍了GraphQL的基本概念、核心组件及其实现方法。GraphQL由Facebook开发,允许客户端精确请求所需数据,提高应用性能。文章详细讲解了如何在C#中使用`GraphQL.NET`库创建Schema、配置ASP.NET Core,并讨论了GraphQL的数据类型及常见问题与解决方案。通过本文,C#开发者可以更好地理解并应用GraphQL,构建高效、灵活的API。
405 64
|
开发框架 .NET 测试技术
C# 一分钟浅谈:GraphQL 数据类型与查询
本文介绍了GraphQL的基本概念、数据类型及查询方法,重点从C#角度探讨了GraphQL的应用。通过Hot Chocolate库的实例,展示了如何在ASP.NET Core中实现GraphQL API,包括安装、定义Schema、配置及运行项目。文中还讨论了常见问题与解决方案,旨在帮助开发者更好地理解和使用GraphQL。
279 2
|
开发框架 自然语言处理 .NET
C#一分钟浅谈:LINQ 查询表达式的使用技巧
【9月更文挑战第6天】LINQ(Language Integrated Query)是C#开发中的强大工具,使查询数据集合变得简单且接近自然语言。本文从基础入手,通过具体示例讲解LINQ查询表达式的使用技巧,包括过滤、排序和分组等操作。同时,文章还探讨了常见问题及解决方法,如性能优化、过早枚举和类型转换等,帮助开发者写出更高效、易维护的代码。
415 17
|
SQL 缓存 分布式计算
C#如何处理上亿级数据的查询效率
C#如何处理上亿级数据的查询效率
489 2
|
SQL 开发框架 .NET
C#进阶-LINQ表达式之GroupBy分组查询
本篇文章我们将演示LINQ扩展包基础语法里的GroupBy分组查询,并实现投影等实际操作中常用的类型转换手法。目前LINQ支持两种语法,我会在每个案例前先用大家熟知的SQL语句表达,再在后面用C#的两种LINQ语法分别实现。LINQ语法第一次接触难免感到陌生,最好的学习方式就是在项目中多去使用,相信会有很多感悟。
698 0
|
C# 索引
C# | 【完全开源】手机号码归属地查询,一秒内百万次查询
这个开源项目是一个.NET库,可以通过手机号码获取号码归属地信息,包括运营商、国家、省份、城市、邮政编码、区号等信息。 该库加载了一个包含46万条数据的“中国手机号归属地信息”数据集,并实现了高速查询。在我的7年老笔记本上执行一百万次查询耗时不足一秒。
1442 0
|
SQL C# uml
C# SQL添加数据,删除数据,修改数据,查询数据
C# SQL添加数据,删除数据,修改数据,查询数据
416 0
C# SQL添加数据,删除数据,修改数据,查询数据
《More Effective C# 》读书笔记 第一章
《More Effective C# 》读书笔记 第一章
268 0