从 Comparison/Converter 到Func 的进化
本篇文章给大家介绍两个在.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 + ")"); } }
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);}
小结
本质上来讲, Comparison/Converter 和与之相对应的Func没有太多区别, 但是为什么.net 让它们同时存在, 或者换句话讲在有了实现方案后, 为什么要"多余"引入后者?
这是因为之后被引入的委托Func<>是一个多功能兵种, 但是在执行具体任务的时候效果稍有区别.
在新项目中, 我们也更倾向于使用新的方法.
参考文章:C#/.NET Little Wonders: The Predicate, Comparison, and Converter Generic Delegates
本文来自于喜乐的ASP.NET(Alex Song) 转贴请注明出处
从 Comparison/Converter 到Func 的进化相关推荐
- Swift字典Dictionary快速文档
Swift Dictionary字典 简述 字典就是通过Key - Value对应关系的数据结构. swift与OC字典区别 类型: Swift字典是值类型, OC字典类型为引用类型 初始化方法 ...
- 您最喜欢的C#扩展方法是什么? (codeplex.com/extensionoverflow)
让我们列出一个答案列表,在其中发布优秀和最喜欢的扩展方法 . 要求是必须张贴完整的代码,并提供示例和使用说明. 基于对该主题的高度兴趣,我在Codeplex上建立了一个名为extensionoverf ...
- 华为提出基于进化算法和权值共享的神经网络结构搜索,CIFAR-10上仅需单卡半天 | CVPR 2020...
作者 | VincentLee 来源 | 晓飞的算法工程笔记 导读:为了优化进化算法在神经网络结构搜索时候选网络训练过长的问题,参考ENAS和NSGA-III,论文提出连续进化结构搜索方法(conti ...
- NAR:查询未培养病毒基因组的综合生态和进化框架IMG/VR v3
IMG/VR v3:一个用于查询未培养病毒基因组的综合生态和进化框架 IMG/VR v3: an integrated ecological and evolutionary framework fo ...
- 一种用XAML写Data Converter的方式
在WPF程序中,数据绑定是非常常用的手段.伴随着数据绑定,我们通常还需要编写一些Converter.而编写Converter是一件非常枯燥的事情,并且大量的converter不容易组织和维护. 今天在 ...
- 不变(Invariant), 协变(Covarinat), 逆变(Contravariant) : 一个程序猿进化的故事
阿袁工作的第1天: 不变(Invariant), 协变(Covarinat), 逆变(Contravariant)的初次约 阿袁,早!开始工作吧. 阿袁在笔记上写下今天工作清单: 实现一个scala类 ...
- VMware vCenter Converter 关闭SSL加密,提高35-40%性能
VMware vCenter Converter 关闭SSL加密,提高35-40%性能 原文:http://www.vmwarearena.com/2013/07/improving-transfer ...
- enas 参数共享_CVPR2020 | CARS: 华为提出基于进化算法和权值共享的神经网络结构搜索,CIFAR10上仅需单卡半天...
点击上方"CVer",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转载自:晓飞的算法工程笔记 为了优化进化算法在神经网络结构搜索时 ...
- lambda表达式之进化
前言 在C#我们可以自定义委托,但是C#为什么还要内置泛型委托呢?因为我们常常要使用委托,如果系统内置了一些你可能会用到的委托,那么就省去了定义委托,然后实例化委托的步骤,这样一来既使代码看起来简洁而 ...
最新文章
- android的UDC功能,Android实现搜索历史功能
- 2018 年最值得期待的学术进展——致人工智能研究者们的年终总结
- Java枚举类使用和总结
- jQuery的$(document).ready()和JavaScript onload事件
- 影响计算机质量度的指标,[计算机]专业版的质量度权重分析.ppt
- CSS 框模型( Box module )
- mysql 一个文章多个分类_jdbc mysql 插入一篇文章并与多个标签,一个分类建立关联关系。...
- oracle sql分析 cost,Oracle SQL的优化技巧详解
- 我的ssis和ssas报错记录
- 【编解码】从零开始写H264解码器(2) NALU
- mysql获取某天的开始时间和结束时间
- sql服务器字段顺序怎么修改,你可能不知道SQL Server索引列的升序和降序带来的性能问题...
- 基于js管理大文件上传以及断点续传
- 电容通电瞬间产生电流的原理
- 小学文凭宝妈在家开网店?其实做跨境并不难!
- node mocha_使用Mocha和Chai测试Node RESTful API
- 初入SAS后的一些小技巧
- 我个人制作的网页网站作品,自学网站制作,自学网页制作网页制作视频教程
- 输入法的好帮手——IMETOOL
- 电脑安装有WPS和OFFICE时,将office设置为默认打开软件