本篇文章给大家介绍两个在.net2.0 中就已经出现的, 很"老"的委托方式.

通常情况下, 我们在Array 和 List<T> 类中使用这些功能. 明白用法和作用可以帮助你自如的使用它们.

但是你也可以使用和它们作用相同的Func 家族的形式 -- 在.NET 2.0 之后引入的新功能.

通过了解这些基本信息可以帮助我们看到一部分.net 进化的过程. 我称这种内容为"历史".

只是抛砖引玉, 希望大家多多交流

Comparison<T>

它的出现是为了对Array 和 List<T> 执行type-safe 排序.

注意, Linq函数的 OrderBy(), ThenBy() 是不支持comparison<T>委托的.

看下面的实例:

using System;using System.Collections.Generic;using System.Linq;

public class Hero{public string Name { get; set; }public int Age { get; set; }public double Power { get; set; }}

class Program{static void Main(string[] args)    {        var heroes = new List<Hero>                            {new Hero {Name = "Goku", Age = 60, Power = 1000.00},new Hero {Name = "Vegeta", Age = 65, Power = 800.00},new Hero {Name = "Ikki", Age = 22,Power = 345.30},new Hero {Name = "Dr. Slump", Age = 40, Power = 1.23},                            };

        Console.WriteLine("***** sort by age ****");        heroes.Sort((lhs, rhs) => Comparer<int>.Default.Compare(lhs.Age, rhs.Age));        Print(heroes);        Console.WriteLine("***** sort by name ****");        heroes.Sort((lhs, rhs) => string.Compare(lhs.Name, rhs.Name));        Print(heroes);        Console.WriteLine("***** sort by power ****");        heroes.Sort((lhs, rhs) => Comparer<double>.Default.Compare(rhs.Power, lhs.Power));        Print(heroes);

        Console.Read();    }

private static void Print(IEnumerable<Hero> heroes)    {foreach (var hero in heroes)        {            Console.WriteLine(hero.Name + "(" + hero.Age + ")");        }    }

很容易理解上面几种排序的方法. 那么使用新的Func时, 实现如下:

Console.WriteLine("***** sort by name(Func) ****");
var heroesOrderByName = heroes.OrderBy(t => t.Name);
Print(heroesOrderByName);

在这种情况下Comparison<T> 使用较少的原因, 就是相对代码工作量大, 实现复杂一些.

Converter<TInput, TOutput>

Converter的使用是对某种类型的列表或者数组进行操作, 将其转化为另外一个类型的列表或者数组.

继续使用上面的代码, 插入:

Console.WriteLine("***** TestFunc ****");TestFunc(heroes);

Console.WriteLine("***** TestConverter ****");TestConverter(heroes);

Console.WriteLine("***** TestLinqSelect ****");TestLinqSelect(heroes);
private static void TestFunc(List<Hero> heroes){    Func<Hero, string> selector = p => p.Name;

    IEnumerable<string> names = heroes.Select(selector);

    print(names);}

private static void TestLinqSelect(List<Hero> heroes){    var names = heroes.Select(p => p.Name);

    print(names);}

private static void TestConverter(List<Hero> heroes){    var names = heroes.ConvertAll(p => p.Name);

    print(names);}

private static void print(IEnumerable<string> names){foreach (string name in names)        Console.WriteLine(name);}

其实上面 TestLinqSelect 和 TestFunc 是同一码事, 我只是给大家提供不同的代码方案而已. 一般, 我们不会使用TestFunc 这种形式.
注意, 用 Linq 的Select 和其他一些Linq的函数一样, 是推迟执行, 这意味着, 很多时候, 它们将不执行转换, 直到数值被使用.
这事实上是双刃剑, 有时候它可以获取更好的效率, 但是如果你马上就想要结果就会导致额外的后台工作开销 -- 支持延迟执行的功能本身需要使用到yield return /yield break 来维持当前状态的信息迭代器.

小结

本质上来讲, Comparison/Converter 和与之相对应的Func没有太多区别, 但是为什么.net 让它们同时存在, 或者换句话讲在有了实现方案后, 为什么要"多余"引入后者?

这是因为之后被引入的委托Func<>是一个多功能兵种, 但是在执行具体任务的时候效果稍有区别.

在新项目中, 我们也更倾向于使用新的方法.

参考文章:C#/.NET Little Wonders: The Predicate, Comparison, and Converter Generic Delegates

本文来自于喜乐的ASP.NET(Alex Song) 转贴请注明出处

从 Comparison/Converter 到Func 的进化相关推荐

  1. Swift字典Dictionary快速文档

    Swift Dictionary字典 简述 字典就是通过Key - Value对应关系的数据结构. swift与OC字典区别 ​ 类型: Swift字典是值类型, OC字典类型为引用类型 初始化方法 ...

  2. 您最喜欢的C#扩展方法是什么? (codeplex.com/extensionoverflow)

    让我们列出一个答案列表,在其中发布优秀和最喜欢的扩展方法 . 要求是必须张贴完整的代码,并提供示例和使用说明. 基于对该主题的高度兴趣,我在Codeplex上建立了一个名为extensionoverf ...

  3. 华为提出基于进化算法和权值共享的神经网络结构搜索,CIFAR-10上仅需单卡半天 | CVPR 2020...

    作者 | VincentLee 来源 | 晓飞的算法工程笔记 导读:为了优化进化算法在神经网络结构搜索时候选网络训练过长的问题,参考ENAS和NSGA-III,论文提出连续进化结构搜索方法(conti ...

  4. NAR:查询未培养病毒基因组的综合生态和进化框架IMG/VR v3

    IMG/VR v3:一个用于查询未培养病毒基因组的综合生态和进化框架 IMG/VR v3: an integrated ecological and evolutionary framework fo ...

  5. 一种用XAML写Data Converter的方式

    在WPF程序中,数据绑定是非常常用的手段.伴随着数据绑定,我们通常还需要编写一些Converter.而编写Converter是一件非常枯燥的事情,并且大量的converter不容易组织和维护. 今天在 ...

  6. 不变(Invariant), 协变(Covarinat), 逆变(Contravariant) : 一个程序猿进化的故事

    阿袁工作的第1天: 不变(Invariant), 协变(Covarinat), 逆变(Contravariant)的初次约 阿袁,早!开始工作吧. 阿袁在笔记上写下今天工作清单: 实现一个scala类 ...

  7. VMware vCenter Converter 关闭SSL加密,提高35-40%性能

    VMware vCenter Converter 关闭SSL加密,提高35-40%性能 原文:http://www.vmwarearena.com/2013/07/improving-transfer ...

  8. enas 参数共享_CVPR2020 | CARS: 华为提出基于进化算法和权值共享的神经网络结构搜索,CIFAR10上仅需单卡半天...

    点击上方"CVer",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转载自:晓飞的算法工程笔记 为了优化进化算法在神经网络结构搜索时 ...

  9. lambda表达式之进化

    前言 在C#我们可以自定义委托,但是C#为什么还要内置泛型委托呢?因为我们常常要使用委托,如果系统内置了一些你可能会用到的委托,那么就省去了定义委托,然后实例化委托的步骤,这样一来既使代码看起来简洁而 ...

最新文章

  1. android的UDC功能,Android实现搜索历史功能
  2. 2018 年最值得期待的学术进展——致人工智能研究者们的年终总结
  3. Java枚举类使用和总结
  4. jQuery的$(document).ready()和JavaScript onload事件
  5. 影响计算机质量度的指标,[计算机]专业版的质量度权重分析.ppt
  6. CSS 框模型( Box module )
  7. mysql 一个文章多个分类_jdbc mysql 插入一篇文章并与多个标签,一个分类建立关联关系。...
  8. oracle sql分析 cost,Oracle SQL的优化技巧详解
  9. 我的ssis和ssas报错记录
  10. 【编解码】从零开始写H264解码器(2) NALU
  11. mysql获取某天的开始时间和结束时间
  12. sql服务器字段顺序怎么修改,你可能不知道SQL Server索引列的升序和降序带来的性能问题...
  13. 基于js管理大文件上传以及断点续传
  14. 电容通电瞬间产生电流的原理
  15. 小学文凭宝妈在家开网店?其实做跨境并不难!
  16. node mocha_使用Mocha和Chai测试Node RESTful API
  17. 初入SAS后的一些小技巧
  18. 我个人制作的网页网站作品,自学网站制作,自学网页制作网页制作视频教程
  19. 输入法的好帮手——IMETOOL
  20. 电脑安装有WPS和OFFICE时,将office设置为默认打开软件

热门文章

  1. 鸿蒙内核源码分析:调度机制篇
  2. 以前写的canvas 小游戏 贪吃蛇代码
  3. FlashFXP客户端 FTP连接,连接很慢的情况,
  4. Oracle数据库对象,同义词、序列、视图、索引
  5. 关于Input内容改变的触发事件
  6. C++中的stack类、QT中的QStack类
  7. oracle 中update多个字段
  8. 基于px2rpx-loader,探讨一下loader的封装思想
  9. 前端项目课程7 banner设计注意事项
  10. GitLab安装,导入,备份