用LINQ来改善代码(完整版).docxVIP

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
用LINQ来改善代码(完整版)

自从学习LINQ以来,我发现了很多使用LINQ来改善代码的方式。每一个技巧都让代码写起来更简单,可读性更强。这里总结了这些技巧。我会介绍如何使用LINQ来:◆初始化数组 ◆在一个循环中遍历多个数组 ◆生成随机序列 ◆生成字符串 ◆转换序列或集合 ◆把值转换为长度为1的序列 ◆遍历序列的所有子集 如果你在LINQ方面有心得也欢迎在评论中一起分享。1. 初始化数组通常,我们需要把数组的值初始化为相同的值或递增的序列值,或者可能是一个步进不为1的递增/递减序列。有了LINQ,我们可以在数组的初始化器中完成所有工作,不再需要循环!在如下的示例代码中,第一行代码初始化了一个长度为10的数组,所有元素都是-1,第二行代码初始化b为0、1、2到9,第三行代码初始化c为100、110、120到190。int[] a = Enumerable.Repeat(-1, 10).ToArray();int[] b = Enumerable.Range(0, 10).ToArray();int[] c = Enumerable.Range(0, 10).Select(i = 100 + 10 * i).ToArray();要提醒一下:如果你初始化一个很大的数组,最好不考虑这种优雅的方式而是使用传统的方式来替代。LINQ的这种解决方案会动态产生数组,因此垃圾数组需要在运行时被回收。也就是说,我总是会在小数组或测试调试代码的情况下使用这种技巧。2. 在一个循环中遍历多个数组有个朋友问我一个C#的问题:有没有办法在一个循环中遍历多个集合?他的代码差不多是这样:foreach (var x in array1) {DoSomething(x);} foreach (var x in array2) {DoSomething(x);}这样的话,循环主体会很大,而且他也不希望这样重复的代码。但是,他又不希望创建一个数组来保存array1和array2的所有元素。LINQ提供了一种优雅的解决方案:Concat操作。我们可以使用单个循环来重写上面的代码,如下:foreach (var x in array1.Concat(array2)) {DoSomething(x);}注意,由于LINQ在枚举器级别进行操作,他不会产生新的数组来保存array1和array2的元素。因此,除了优雅之外,这个方案还很高效。3. 生成随机序列这是一个生成N长度随机序列的简单技巧:?Random rand = new Random();varrandomSeq = Enumerable.Repeat(0, N).Select(i = rand.Next());有了LINQ的延迟特性,序列不会实现进行计算并保存到数组中,而是在迭代randomSeq的时候按需生成随机数。LINQ同样也是生成各种类型字符串的好工具。对于测试或调试,生成字符串时很有用的。假设我们需要生成一个N长度的字符串,按照“ABCABCABC”的方式。使用LINQ,解决方案非常优雅:  stringstr = new string(  Enumerable.Range(0, N)  .Select(i = (char)(‘A’ + i % 3))  .ToArray());  PetarPetrov给出了另外一种有趣的方式使用LINQ来生成字符串:  string values = string.Join(string.Empty, Enumerable.Repeat(pattern, N).ToArray());  5. 转换序列或集合  在C#或VB中我们不能实现把序列从T类型转换为U类型,即使T从U类继承。因此,即使把List转换为List转换为IEnumerable的话,LINQ有一个简单而有效的解决方案:  IEnumerablestrEnumerable = …;  IEnumerable  如果我们需要转换List为List,LINQ也提供了解决方案,但是它会进行列表的复制:  ListstrList = …;  List(strList.Cast());  Chris Cavanagh建议另外一种解决方式:  varobjList = strList.Cast().ToList(); 6. 把值转换为长度为1的序列  当我们需要把单个值转化为一个长度为1的序列时,会怎么做?我们可以创建一个长度为1的数组,但是我还是喜欢LINQ的Repeat操作:  IEnumerableseq = Enumerable.Repeat(myValue, 1);  7. 遍历序列的所有子集  有的时候,遍历数组的所有子集很有用。子集和问题、布尔可满足性问题以及背包问题都可以通过遍历某个序列的所有子集来简单解决。  有了LINQ

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档