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

2025-05-18 03:10:39
推荐回答(1个)
回答1:

��兄馗醇�档脑�靥蕹��霰A粢桓觯〉比籐inq中有Distinct扩展,但其功能简直是弱爆了!用过的同志相信都对Distinct扩展吐槽无数遍了吧!如果你要使用Distinct扩展实现DistinctBy扩展的功能,还要专门定义一个辅助类!Oh,My God!这简直是对程序员的谋杀!但是等经历过无数个纠结之后,我突然发现,微软在标准的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