问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何正确看待Linq的DistinctBy扩展和ForEach扩展

发布网友 发布时间:2022-04-11 17:58

我来回答

1个回答

热心网友 时间:2022-04-11 19:27

微软在标准的Linq中实际上是包含了DistinctBy扩展的功能的,只不过不那么直接,看下面的示例代码:
class Person{public int Age { get; set; }
public string Name { get; set; }
public override string ToString(){return string.Format("Age:{0} Name:{1}", Age, Name);}}[STAThread]
static void Main(){var persons = new[] {
new Person{Age = 10,Name="a"},
new Person{Age = 10,Name="b"},
new Person{Age = 10,Name="c"},
new Person{Age = 20,Name="d"}};foreach (var p in persons.GroupBy(o=o.Age).Select(g=g.First())){Console.WriteLine(p);}}运行结果从结果看,代码成功完成了根据键值Age进行Distinct的操作。
明眼人可能一眼就看出来了,不错,就是使用GroupBy、Select和First这三个子操作组合出DistinctBy的功能!只不过实现一个DistinctBy功能需要写这么做代码实在是不好,于是可以封装一下,把GroupBy、Select和First这三个子操作的组合封装成一个DistinctBy扩展方法,就可以方便的使用了。封装的代码 too simple,就不贴上来了!
关于ForEach扩展
1.Linq中已经有Select扩展了,因此不必在实现一个ForEach,因为在大多数情况下可以用Select来实现ForEach的功能(当然我不建议这样做,因为Select是延迟操作,如果仅仅实现ForEach功能,有些时候代码不能够按照设计意图正确运行);
2.ForEach破坏了Linq的编程模式,就是说破坏了链式编程模式,所谓链式编程,大概的意思就是将多个操作通过点号.链接在一起,相信写过Linq的同志很清楚这句话的含义吧!
我看到网上有人这么来设计ForEach扩展:
public static void ForEach<T(this IEnumerable<T source, Action<T foreachAction){foreach (var t in source){foreachAction(t);}}我不得不说这是简直是对Linq的“亵渎”啊,试想,如果别人使用了你的这个ForEach之后,后续操作岂不是成天方夜谭了吗?所以说这样设计ForEach是万万不可的!即使勉强要设计,也要设计成这样才对啊!
public static IEnumerable<T ForEach<T(this IEnumerable<T source, Action<T foreachAction){foreach (var t in source){foreachAction(t);}return source;}而且在我看来,这样添加ForEach扩展并不妥当,原因在于:这样设计的ForEach扩展,破坏了Linq的延迟操作特性!
所以说,我认为微软不在Linq中包含ForEach扩展算是一个正确的选择,如果要用到ForEach功能,还是老老实实用foreach语句来写吧!其实也并不复杂!
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
孤胆枪手怎么设置局域网啊、 我家小狗刚领来,没有名字,拜托大家起个名字。 护肤品代加工 水浒Q传跨服PK是怎么回事啊 新水浒Q传什么叫PK保护状态,上号不到一分钟就被打,求解 水浒Q传 为什么要pk有什么好处? 为什么贷款每次都审核失败 有谁能说一下手机贷审核不通过的原因吗?我都审核好多次了都不能通过... 贷款审核失败是什么原因 为什么贷款未通过审核 对单个字段的结果进行去重,用distinct执行效率快,还是用group by快 如果查询多列数据,distinct怎么不起作用了?sql SQL DISTINCT 问题请教 sql高手进!关于在sqlserver里实现一个表多字段distinct查询的问题。 sql,select distinct,怎么显示多列??,怎么还是有重复的住院号? sql 语句 distinct 多列显示问题 distinct可以多列吗 distinct和groupby在查询多列数据去重复时的区别在哪 在SQL2008中,我想把其中某表的某个字段的数据类型从int改成text,可是不成功,这是为什么呢? 在Sql server 2000数据库中的表中定义的一个字段是ntext类型,但导入内容会出问题,怎么办? 加急!如何替换sql中ntext类型数据中的某个字符? SQL替换字段最后一个字符和几个字符 求SQL批量修改表里字段!!! 用sql 语句实现页数中将“128页”中的页字换掉成为“128”,哪位大侠帮帮忙了。 如何把sql2000中数据库定时同步到sql2008数据库? SQLSERVER2000 把旧数据存储到另外一个数据库中 SQL 2000 server在同一台服务器2个数据库的表同步问题 2台SQL2000数据库数据如何实时同步 ASP+SQL Server2000如何进行参数化查询 sql 已知存储过程 怎么查询哪些功能调用了这些存储过程的 关于如何删除DataTable中的重复行 Sqlserver2012 在还原.bak文件的时候,不能选择源文件,这是怎么回事? 如果不小心删除了电脑中的*.bak文件,导致officeXP或office2003无法使用,如何解决? 急需解决:系统还原 硬盘分区情况同备份时不同,不能执行系统恢复操作! 硬盘分区情况同备份时不同,不能执行系统恢复操作 ibatis中sql.xml怎么分割字符串并循环 sqlserver语句中,怎么样将字符串&#39;ab00000008&#39;减去2,得到&#39;ab00000006&#39; c#读取xml 中的数据库连接字符串 .net 执行 sql 语句 如何在asp.net中执行sql脚本文件 C#.NET 怎么对WINDOWS的CMD命令操作 .net 执行一个sql脚本 c# .net中 对于access数据库执行sql命令 ASP.NET执行sql语句 ASP.NET怎样使用SQL语句呢? asp.net 如何一次执行多条件Sql语句,如何解决? sqlserver 自定义函数怎么接收关键字参数 存储过程数据排序问题 用存储过程分页后,前台上一页,跳转页怎么写