C#开发157
C#开发157条建议
编写高质量代码改善C#程序的157个建议[匿名类型、Lambda、延迟求值和主动求值]
前言
从.NET3.0开始,C#开始一直支持一个新特性:匿名类型。匿名类型由var、赋值运算符和一个非空初始值(或以new开头的初始化项)组成。匿名类型有如下基本特性:
1、既支持简单类型也支持复杂类型。简单类型必须是一个非空初始值,复杂类型则是一个以new开头的初始化项。
2、匿名类型的属性是只读的,没有属性设置器,它一旦倍初始化就不可更改。
3、如果两个匿名类型的属性值相同,那么就任务这两个匿名类型相等。
4、匿名类型可以在循环中用作初始化器。
5、匿名类型支持智能感知。
6、匿名类型也可以拥有方法。
本文已更新至http://www.cnblogs.com/aehyok/p/3624579.html 。本文主要学习记录以下内容:
建议26、使用匿名类型储存LINQ查询结果
建议27、在查询中使用Lambda表达式
建议28、理解延迟求值和主动求值之间的区别
建议26、使用匿名类型储存LINQ查询结果
我们直接来看一个简单的实例吧,假如现在有一个公司Company的实体类,然后又有一个人员的Person类,现在需要将Person类中的Name和Company类中的Name进行关联,而形成一个新的类型。
Compay类
public class Company
{
public int ComparyId { get; set; } public string Name { get; set; }
}
Person类
public class Person
{
public int PersonId { get; set; } public string Name { get; set; } public int CompanyId { get; set; }
}
简单初始化数据
List<Company> companyList = new List<Company>() {
new Company(){ComparyId=1, Name="MicroSoft"},
new Company(){ComparyId=2, Name="SamSung"}
};
List<Person> personList = new List<Person>() {
new Person(){ PersonId=1,Name="aehyok",CompanyId=1},
new Person(){ PersonId=2,Name="aehyok",CompanyId=2},
new Person(){ PersonId=3,Name="aehyok",CompanyId=1},
new Person(){ PersonId=4,Name="aehyok",CompanyId=2},
};
下面来看最重要的部分
var personWithCompany = from person in personList
join company in companyList
on person.CompanyId equals company.ComparyId
select new { PersonName = person.Name, CompanyName = company.Name };
其中new之前的代码是Linq关键字,new之后的代码就是匿名类型的初始化项。该匿名类型包含两个属性:PersonName和CompanyName。
foreach(var item in personWithCompany)
{
Console.WriteLine(string.Format("{0}\t:{1}", item.PersonName, item.CompanyName));
}
Console.ReadLine();
调用结果如下所示
建议27、在查询中使用Lambda表达式
Linq实际上是基于扩展方法和lambda表达式的,理解了这一点就不难理解Linq。任何Linq查询都能通过调用扩展方法的方式来替代。下面我们将建议26中的查询语句进行修改
修改之前
var personWithCompany = from person in personList
join company in companyList
on person.CompanyId equals company.ComparyId
select new { PersonName = person.Name, CompanyName = company.Name };
修改之后
var personWithCompany = from person in personList
select new { PersonName = person.Name, CompanyName = person.CompanyId == 1 ? "MicroSoft" : "SamSung" };
当然还有另外一种方式
var personWithCompany = personList.Select(person => new { PersonName = person.Name, CompanyName = person.CompanyId == 1 ? "MicorSoft" : "SamSung" });
针对LINQ设计的扩展方法大多应用了泛型委托。System命名空间定义了泛型委托Action、Func、Predicate。可以这样理解这三个委托:Action用于执行一个操作,所以它没有返回值,Func用于执行一个操作并返回一个值,Predicate用于定义一组条件并判断参数是否符合条件。Select扩展方法接受的就是一个Func委托,而Lambda表达式其实就是一个简介的委托,运算符“=>”左边代表的是方法的参数,右边的是方法体。
下面我们再来举个简单的小例子,调用Where扩展方法,查找出“SamSung”公司的员工
var personWithCompany = personList.Select(person => new { PersonName = person.Name, CompanyName = person.CompanyId == 1 ? "MicorSoft" : "SamSung" });
foreach (var item in personWithCompany.Where(pItem => pItem.CompanyName == "SamSung"))
{
Console.WriteLine(item.PersonName);
}
建议28、理解延迟求值和主动求值之间的区别
我们先继续看一个简单的小例子:
static void Main(string[] args)
{
List<int> list = new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
var temp1 = from c in list where c > 5 select c;
var temp2 = (from c in list where c > 5 select c).ToList<int>();
list[0] = 11;
Console.Write("temp1:");
foreach (var item in temp1)
{
Console.Write(item.ToString());
}
Console.Write("\ntemp2:");
foreach (var item in temp2)
{
Console.Write(item.ToString());
}
Console.ReadLine();
}
这代码很简单,看执行结果
在延迟求值的情况下,只是定义了一个查询,而且不是立刻执行。对查询结果的访问每次都会遍历原集合。如上文中对于temp1的迭代,在迭代之前,我们修改了list[0]的值,可以看到,修改直接影响了迭代的输出。对查询调用ToList、ToArray等方法,将会使其立即执行,由于对list[0]的修改是在temp2查询之后进行的,所以针对list[0]的修改不会影响到temp2的结果。
在使用Linq to SQL时,延迟求值能够带来显著的性能提升。举个例子:如果定义了两个查询:而且采用延迟求值,CLR会合并两次查询并生成一个最终的查询。
英语小贴士
1、Mineral water——矿泉水 beer——啤酒
2、May I see your passport, please?——我能看一下你的护照吗? Here is my passport / Here it is.——这是我的护照。
3、What‘s the purpose of your visit?——旅行目的为何? Sightseeing(Businese).——观光(公务)
4、Do you have a return ticket to Taiwan?——是否有台湾回程机票? Yes, here it is.——这是我的回程机票
5、How long will you be staying in the United States?——5 days.
6、How much money do you have with you?——你随身携带多少现金? I have 800 dollars.——大约800元
7、Where are you staying?——将在那儿住宿? I will stay at Boston Hotel.——我将住在波士顿饭店。
8、I’m just passing through.——我只是过境而已。
9、I am leaving for Geneva tonight.——今晚即动身前往日内瓦。
作者:aehyok
出处:http://www.cnblogs.com/aehyok/
感谢您的阅读,如果您对我的博客所讲述的内容有兴趣,那不妨点个推荐吧,谢谢支持:-O。
C#开发157的更多相关文章
- C#程序的157个建议
编写高质量代码改善C#程序的157个建议——导航开篇 前言 由于最近工作重心的转移,原来和几个同事一起开发的项目也已经上线了,而新项目就是在现有的项目基础上进行优化延伸扩展.打个比方,现在已经上线 ...
- 第06组 Beta冲刺(4/5)
队名:拾光组 组长博客链接 作业博客链接 团队项目情况 燃尽图(组内共享) 组长:宋奕 过去两天完成了哪些任务 继续维护后端代码 继续学习深入python 继续研究匿名拨打电话问题.套牌多结果处理问题 ...
- 第06组 Beta冲刺(3/5)
队名:拾光组 组长博客链接 作业博客链接 团队项目情况 燃尽图(组内共享) 组长:宋奕 过去两天完成了哪些任务 继续维护后端代码 学习深入python 研究匿名拨打电话问题.套牌多结果处理问题 Git ...
- 架构师速成6.7-设计开发思路-uml 分类: 架构师速成 2015-07-29 18:25 157人阅读 评论(0) 收藏
uml是什么东西?统一建模语言,一门语言,是用来进行软件设计的一门语言. 其实一门语言的诞生并不伟大,让大多数人都使用才足够伟大.uml就是一门伟大的语言,因为目前软件设计的唯一语言就是它. UML其 ...
- 《Android NFC 开发实战详解 》简介+源码+样章+勘误ING
<Android NFC 开发实战详解>简介+源码+样章+勘误ING SkySeraph Mar. 14th 2014 Email:skyseraph00@163.com 更多精彩请直接 ...
- 轻量级Java EE企业应用实战(第4版):Struts 2+Spring 4+Hibernate整合开发(含CD光盘1张)
轻量级Java EE企业应用实战(第4版):Struts 2+Spring 4+Hibernate整合开发(含CD光盘1张)(国家级奖项获奖作品升级版,四版累计印刷27次发行量超10万册的轻量级Jav ...
- ASP.NET程序开发范例宝典
在整理资料时发现一些非常有用的资料源码尤其是初学者,大部分是平时用到的知识点,可以参考其实现方法,分享给大家学习,但请不要用于商业用途. 如果对你有用请多多推荐给其他人分享. 点击对应章节标题下载本章 ...
- IOS开发基础知识--碎片6
三十三:IOS多视图跳转方法 第一种: 跳转:[self presentModalViewController:control animated:YES]; 返回:[self dismissModal ...
- Windows phone应用开发[19]-RSA数据加密
在这个系列的第十六章节中Windows phone应用开发[16]-数据加密 中曾详细讲解过windows phone 常用的MD5,HMAC_MD5,DES,TripleDES[3DES] 数据加密 ...
随机推荐
- hdu1588---Gauss Fibonacci(矩阵,线性复发)
根据题意:最后一步是寻求f(b) + f(k + b) + f(2 * k + b) + -+ f((n-1) * k + b) 清除f(b) = A^b 间A = 1 1 1 0 所以sum(n - ...
- Microsoft.AlphaImageLoader过滤评论
Microsoft.AlphaImageLoader是IE滤镜的一种,其主要作用就是对图片进行透明处理.尽管FireFox和IE7以上的IE浏览器已经支持透明的PNG图片,可是就IE5-IE6而言还是 ...
- Git客户端(Windows系统)的使用(Putty)(转)
本文环境: 操作系统:Windows XP SP3 Git客户端:TortoiseGit-1.8.14.0-32bit 一.安装Git客户端 全部安装均采用默认! 1. 安装支撑软件 msysgit: ...
- asp.net学习之扩展GridView
原文:asp.net学习之扩展GridView 本节讨论如何从现有的控件,进而扩展成强大的,更定制的GridView控件 1.扩展BoundField 默认的BoundField不能显示多文本,文字一 ...
- Intel 80x86 寻址模式
随着进一步的研究,我们会逐渐接触到你的电脑配置模式的内在联系,和设计原则.在这些,解决计算机是一个非常重要的概念,我们需要很好地理解了什么. 一.预赛: (1)作数 在接触寻址方式之前,我们还要先了解 ...
- 网络资源(6) - EJB视频
2014_08_24 http://v.youku.com/v_show/id_XMjE0NjE3MDA0.html?f=5227828 01_EJB3.0_下载安装与运行jboss -------- ...
- [全国首发]Swift视频教程
我真的很抱歉,每个人,从7带班开始到现在,最后的成品带. 到了最新的版本号,Swift语言一直在更新,非常多写法都变了.大家能够加我私人微信:wanghj29,我会在朋友圈更新swift的最新动态.此 ...
- 在LINQ中实现多条件联合主键LEFT JOIN
我昨天遇到一个LINQ下使用多条件比对产生LEFT JOIN的问题,经过深入研究,终于解决了,也让我学到了新的东西,特地拿来分享. 实例:有一张库存异常变更视图KCYD,仓库ID[Ckid]和物品ID ...
- HDU4405-Aeroplane chess(可能性DP需求预期)
Aeroplane chess Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- EF中的贪婪加载和延迟加载(懒加载)
在上一章中,我们使用了Linq对Entity Framework进行了一个查询,但是通过学习我们却发现了懒加载给我来的性能上的开销是很到的,尤其是在循环中,如果数据量不是很多的情况下还可以接受,如果数 ...