首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

编写高质量代码改善C#程序的157个建议

本文主要学习记录以下内容:   建议26、使用匿名类型储存LINQ查询结果   建议27、在查询中使用Lambda表达式   建议28、理解延迟求值和主动求值之间的区别 建议26、使用匿名类型储存...LINQ查询结果   我们直接来看一个简单的实例吧,假如现在有一个公司Company的实体类,然后又有一个人员的Person类,现在需要将Person类中的Name和Company类中的Name进行关联...任何Linq查询都能通过调用扩展方法的方式来替代。...可以这样理解这三个委托:Action用于执行一个操作,所以它没有返回值,Func用于执行一个操作并返回一个值,Predicate用于定义一组条件并判断参数是否符合条件。...在使用Linq to SQL时,延迟求值能够带来显著的性能提升。举个例子:如果定义了两个查询:而且采用延迟求值,CLR会合并两次查询并生成一个最终的查询。

76040

编写高质量代码:改善C#程序的157个建议

重写Equals()时同时重写GetHashCode() 否则会出现潜在的不易察觉的BUG,例如在Dictionary中,CLR内部查找的实际是Key值的HashCode...使用匿名类型存储LINQ查询结果 在查询中使用Lambda表达式 实际上我只用Lambda表达式,因为个人认为LINQ的查询语法相当怪异,像SQL又有不同,看上去很别扭。...理解延迟求值和主动求值的区别 LINQ查询表达式并没有立即执行,只有在执行ToList()或者遍历时才会执行。...使用LINQ,不需要再使用集合的比较器和迭代器 LINQ极大简化了集合操作,理解比较器和迭代器的原理还是重要的,但开发中已经不再需要去实现它们了。...在LINQ查询中避免不必要的迭代 使用First()、Take()等方法,比使用Where()迭代的次数更少。 感谢阅读,希望这篇文章能给你带来帮助!

2.6K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C#规范整理·集合和Linq

    ,它更重要的作用是为LINQ查询中的匿名类型进行属性的初始化。...任何LINQ查询都能通过调用扩展方法的方式来替代,如下面的代码所示: foreach(var item in personList.Select(person=>new{PersonName= person.Name...可以这样理解这三个委托:Action用于执行一个操作,所以它没有返回值;Func用于执行一个操作并返回一个值;Predicate用于定义一组条件并判断参数是否符合条件。...13.区别LINQ查询中的IEnumerable<T>和IQueryable<T># LINQ查询方法一共提供了两类扩展方法,在System.Linq命名空间下,有两个静态类:Enumerable类,它针对继承了...在使用IQueryable<T>查询的时候,如果使用自定义的方法,则会抛出异常。 13.使用LINQ取代集合中的比较器和迭代器# LINQ提供了类似于SQL的语法来实现遍历、筛选与投影集合的功能。

    22730

    【ASP.NET Core 基础知识】--最佳实践和进阶主题--性能调优和缓存

    在处理大型数据集时,尽量避免使用 LINQ 查询,而是考虑使用原生 SQL 查询或者其他更为高效的数据访问方法。...可以通过 ASP.NET Core 中的日志记录功能或第三方监控工具来实现缓存性能的监控和分析。...高资源利用率可能会影响应用程序的性能和稳定性。 通过监控工具收集和分析服务器资源利用率的数据,并查找可能的瓶颈和优化方案。 可以通过优化代码、缓存数据、增加服务器资源等方法来降低服务器资源利用率。...通过对以上性能指标的分析,可以识别应用程序的性能瓶颈和潜在问题,并采取相应的优化措施来提高应用程序的性能和用户体验。...性能调优方面,建议减少数据库查询、使用异步编程、优化 LINQ 查询、改善循环和集合操作、使用缓存等方法。

    20500

    .NET程序员必备的58个提高效率工具

    T4 Text Template::在 Visual Studio 中,T4 Text Template 用作生成代码文件的模板。模板可以通过编写文本块和控制逻辑来定义。...Indent Guides:在每个缩进级别添加垂直线。 PowerShell Tools:一套用于开发和调试 PowerShell 脚本以及 Visual Studio 2015中模块的工具。...memprofiler:查找内存泄漏并优化内存使用的强大工具。 PostSharp:删除重复编码,并防止由于横切关注点以及面向方面编程而造成的代码膨胀。...LINQ LINQ Pad?:LINQPad 是一个轻量级的工具,用于测试对 SQL Server 数据库的 LINQ 查询。它也可以测试用不同的 .NET 语言,如C#,VB 等写的代码片断。...LINQ Insight:LINQ Insight Express 是一个 Visual Studio 插件,它允许你在设计时分析你的 LINQ 查询,并简化了编写和调试 LINQ 查询。 7.

    4.1K60

    MySQL InnoDB MVCC机制

    属性值在 max_trx_id和min_trx_id之间(包含),那就需要判断一下 trx_id 的值是不是在 m_ids 列表中。...在MySQL中, 实际上每条记录在更新的时候都会同时记录一条回滚操作到undolog(undolog默认在mysql的data文件夹中)中....当二级索引列被更新时,旧二级索引记录被删除标记,新记录被插入,并且被删除标记的记录最终被清除(当该记录不再被需要时), 当二级索引记录被标记删除或二级索引页面被更新时,则在聚集索引中查找数据库记录....如果没有找到匹配的记录,则无需在聚集索引中查找。如果找到匹配的记录,即使记录被标记删除,也会在聚集索引中查找记录 5....且因为name这行只是被标记删除, 所以name这个条件仍可以用于查询.

    94500

    【BCT认证_组播DNS】 DNS SRV RR

    编码否定响应的设计原理 考虑了断言不存在的替代方法,例如使用 NXDOMAIN 响应,或发出资源记录零长度 rdata。 使用 NXDOMAIN 响应不适用于多播 DNS。...通过发出零长度的资源记录来断言不存在rdata 将意味着无法区分一个不存在的记录,一个确实存在的记录,零 -长度数据。...通过 NSEC 记录断言不存在的好处而不是通过 NXDOMAIN 响应是可以将 NSEC 记录添加到DNS 响应的附加部分以提供附加信息超出查询器明确要求的范围。...如果附加部分中没有此信息,它将使查询器进行额外的往返以执行附加查询以确定目标主机没有 AAAA记录。 (可以说单播 DNS 也可以从这种能力中受益在附加部分表示不存在,但那是超出本文档的范围。)...,记录在一组三个 Internet-草稿: “替代 AppleTalk 名称绑定的协议要求协议 (NBP)” [RFC6760] 是对 AppleTalk 的概述名称绑定协议,因为 IETF 社区中的许多人都有几乎没有使用

    1.8K30

    xBIM 基础14 使用LINQ实现最佳性能(优化查询)

    LINQ代表语言集成查询,它是3.5版以来的.NET Framework的一部分。它实现延迟执行,这意味着您可以链接查询语句,并且在您实际迭代结果之前它将不执行任何操作。...我们更喜欢后一种方法,但它是等效的。以下示例显示了两种变体都做同样的事情。两个查询的结果都是枚举具有任何开口的墙的全局唯一ID。...效果与上述的 Linq 表达式相同 var ids = model.Instances .Where(wall => wall.HasOpenings.Any())...IEntityCollection实现实现了像大多数的LINQ的数据检索方法重载 Where(),Count(),FirstOrDefault(),OfType(),它是在最低水平快速数据访问进行了优化...xBIM在内部使用实体类型作为第一级过滤器,因此您应始终询问最具体的类型。请记住,它IModel.Instances包含模型中的所有实体,通常是数十万个对象!所以你不想迭代所有这些来做任何事情。

    1K20

    Entity Framework 的一些性能建议

    这是一篇我在2012年写的老文章,至今适用(没错,我说的就是适用于EF Core)。因此使用微信重新推送,希望能帮到大家。 自从我用了EF,每次都很关心是否有潜在的性能问题。...所以每次我写LINQ查询,都会使用SQL Profiler看一下实际生成的SQL语句,以便发现潜在的性能问题。也强烈建议大家这么去做,以免日后软件大了出了问题很难查。 ?...执行的时机是用到这个表达式结果的时候才去执行。 在公司码程序的时候,我看到好多同事用EF,写完查询喜欢直接调用ToList()方法。有时候这会造成很大的性能问题。.... // 建立查询,但不执行 var result = query.ToList(); // 立即执行查询 所以,你应当尽量避免从ToList()后的结果中再去查找自己想要的元素。 ?...大部分时候这两个接口在使用上的表现都是一致的,但如果你要做的是一个不确定的查询,意思是这个查询表达式不是一次性确定的,对于它的结果可能由别的类来选择到底select哪些东西,这时候就要用IQueryable

    1.7K30

    .NET面试题系列 - LINQ to Object

    LINQ的一些问题:要时刻关注转换的SQL来保持性能,另外,某些操作不能转换为SQL语句,以及很难替代存储过程。...某种程度上可以代替SQL Management Studio,是使用SQL Management Studio作为数据库管理软件的码农的强力工具,可以用于调试和性能优化(通过改善编译后的SQL规模)。...内连接和分组连接的一个重要区别是:分组连接的结果数一定和左边的表的记录数相同(例如本例中左边的表Defects有41笔记录,则分组连接的结果数一定是41),即使某些左边表内的记录在右边没有对应记录也无所谓...表中有6笔记录,在Projects表中有3笔记录,则结果将会是18笔: ?...对这两种写法的优劣有很多说法: 每个查询表达式都可以被转换为点标记的形式,而反过来则不一定。很多LINQ操作符不存在等价的查询表达式,例如Reverse,Sort等等。

    3.4K20

    Redis 学习笔记4 - 数据结构的使用

    sismember 命令,用于查询一个值是否属于一个集合,就是 O(1)。 sismember 是个强力的命令,很大一个原因就是快。Redis 中的大多数命令都是 O(1)。...zadd 是一个 O(log(N)) 命令,N 表示在有序集合中的元素个数。 O(N) O(N) 在表中查找没有做索引的列就是一个 O(N) 操作。就像用 ltrim 命令一样。...但是,在 ltrim 中,N 不是列表的元素个数,而是要移除的元素的个数。...1.3 引用和索引(References and Indexes) 上面的查询优化的例子,其实是 手工维护你的 value 之间的索引和 引用。这样的方式很常见。...该命令通过指定模式返回所有匹配的 key。这个命令看起来在某些情况下很适用,但是它绝对不应当用在产品代码中。因为它为了查找匹配的 key 会对所有的 key 做一个线性扫描,它很慢。

    40830

    MySQL MVCC详解

    有没有一种方式,可以不采用锁机制,而是通过乐观锁的方式来解决不可重复读和幻读问题呢?实际上 MVCC 机制的设计,就是用来解决这个问题的,它可以在大多数情况下替代行级锁,降低系统的开销。...否则,如果 trx_id 不存在于 trx_ids 集合中,证明事务 trx_id 已经提交了,该行记录可见。...需要说明的是,在隔离级别为读已提交(Read Commit)时,一个事务中的每一次 SELECT 查询都会获取一次 Read View。...Read View 与已提交读在已提交读的隔离级别下,每一次查询语句都会重新生成一个 Read View。这意味着在事务执行过程中,Read View 是在不断变动的。...如果我们同时开启事务 A 和事务 B,先在事务 A 中进行某个条件范围的查询,读取的时候采用排它锁,在事务 B 中增加一条符合该条件范围的数据,并进行提交,然后我们在事务 A 中再次查询该条件范围的数据

    2.5K141

    学好Elasticsearch系列-聚合查询

    } } } 在这个查询中: "distinct_user_ids" 是我们自己为这个聚合命名的标签。...nested 类型允许你将一个文档中的一组对象作为独立的文档进行索引和查询,这对于拥有复杂数据结构(例如数组或列表中的对象)的场景非常有用。...基于聚合结果的查询(Post-Filter):这种情况下,我们先执行聚合,然后基于聚合的结果执行过滤操作。这通常用于在聚合结果中应用一些额外的过滤条件。...需要注意的是,由于 Elasticsearch 默认会对桶进行优化,所以在使用 size 参数时可能无法得到完全准确的结果。...需要注意的是,在新版本的 Elasticsearch 中(7.0 以后),_term 已经被 key 替代用于排序。

    49220

    可能是全网最深度的 Apache Kylin 查询剖析

    中添加) 中存在不在 cube aggregations 中的情况 limit 在 agg 之前(使用 OLAPContext#limitPrecedesAggr 判断,在 OLAPAggregateRel...在 Kylin 中,OLAPJoinRel 对应的物理节点还是其自身,当 OLAPJoinRel#implement 生成用于生成 java code 的 Result 时,并不会使用到其 children...去 HBase 中查询指定 cube、指定 cuboid(及可能的 filter 下推)数据 public final org.apache.calcite.linq4j.Enumerator...cuboid 存在,则使用该 cuboid 当不存在,则会尝试从已经存在的 cuboids 中寻找一个最佳的替代 cuboid,具体过程封装在 CuboidScheduler#findBestMatchCuboid...中,比如当 cuboid id 为 001000000000000100 的 cuboid 不存在,会使用 id 为 111111111111111111 的 cuboid 上述使用替代的 cuboid

    1.8K50

    【深入浅出C#】章节 9: C#高级主题:LINQ查询和表达式

    LINQ的用途包括但不限于: 数据库查询:可以用LINQ查询关系型数据库,代替传统的SQL查询。 集合操作:可以对集合进行过滤、排序、分组等操作,替代传统的循环遍历。...优化和提升: LINQ提供程序会尝试对查询进行优化,以提高查询性能。这可能包括筛选和投影操作的优化,以及在数据库查询中生成最优化的SQL查询语句。...当查询被执行时,它会使用最新的数据源进行计算,而不是在查询链创建时的数据源。 可以用于在遍历大量数据时优化性能,只计算和返回必要的数据。...五、LINQ与匿名类型 5.1 使用匿名类型处理查询结果 在LINQ中,匿名类型是一种临时的、只在查询中使用的类型,用于存储查询结果的部分或全部数据。...十、LINQ查询性能和优化 优化 LINQ 查询的性能是一个重要的课题,特别是在处理大量数据时。虽然 LINQ 提供了方便的查询语法,但不当的使用方式可能导致性能下降。

    2.3K61

    一步步学习EF Core(3.EF Core2.0路线图)

    嗯..下面就是微软爸爸觉得需要,但是还在研发 或者斟酌的东西:   3.1Query(查询) 改进的Linq翻译将使更多的查询成功执行,使得更多的逻辑在数据库(而不是内存中)中进行查询,从而减少不必要的数据库访问...(这一项已经在2.0预览版本完成了很多.) 延迟加载功能。 对于不在模型中的原始SQL语句查询,允许使用原始SQL语句查询来填充不在模型中的类型(通常用于非规范化的视图模型数据)。  ...改进的LINQ翻译(来自于GitHub上的各种问题) - 允许更多的查询成功执行,更多的逻辑在数据库中执行(而不是内存中),从而减少不必要地从数据库查询数据。...手动编译查询(#8449) - 允许查询表达式与代理相关联,从而可以只编译一次但执行多次,从而不会导致增加高速缓存键计算和高速缓存查找的成本。...GroupBy翻译#2341 - 允许使用GroupBy()运算符翻译LINQ查询,该项目用于汇总要使用GROUP BY转换为SQL查询的函数。

    3.1K90
    领券