��兄馗醇�档脑�靥蕹��霰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