`
lovnet
  • 浏览: 6670259 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

【翻译】使用LINQ来简化编程的7个技巧

阅读更多

【翻译】使用LINQ来简化编程的7个技巧

原文地址:http://igoro.com/archive/7-tricks-to-simplify-your-programs-with-linq/

自从学习LINQ以来,我发现了很多使用LINQ来改善代码的方式。每一个技巧都让代码写起来更简单,可读性更强。

这里总结了这些技巧。我会介绍如何使用LINQ来:

  • 初始化数组

  • 在一个循环中遍历多个数组

  • 生成随机序列

  • 生成字符串

  • 转换序列或集合

  • 把值转换为长度为1的序列

  • 遍历序列的所有子集

如果你在LINQ方面有心得也欢迎在评论中一起分享。

1. 初始化数组

通常,我们需要把数组的值初始化为相同的值或递增的序列值,或者可能是一个步进不为1的递增/递减序列。有了LINQ,我们可以在数组的初始化器中完成所有工作,不再需要循环!

在如下的示例代码中,第一行代码初始化了一个长度为10的数组,所有元素都是-1,第二行代码初始化b0129,第三行代码初始化c100110120190.

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);

}

这样的话,循环主体会很大,而且他也不希望这样重复的代码。但是,他又不希望创建一个数组来保存array1array2的所有元素。

LINQ提供了一种优雅的解决方案:Concat操作。我们可以使用单个循环来重写上面的代码,如下:

foreach (var x in array1.Concat(array2)) {

DoSomething(x);

}

注意,由于LINQ在枚举器级别进行操作,他不会产生新的数组来保存array1array2的元素。因此,除了优雅之外,这个方案还很高效。

3. 生成随机序列

这是一个生成N长度随机序列的简单技巧:

Random rand = new Random();

var randomSeq = Enumerable.Repeat(0, N).Select(i => rand.Next());

有了LINQ的延迟特性,序列不会实现进行计算并保存到数组中,而是在迭代randomSeq的时候按需生成随机数。

4. 生成字符串

LINQ同样也是生成各种类型字符串的好工具。对于测试或调试,生成字符串时很有用的。假设我们需要生成一个N长度的字符串,按照“ABCABCABC”的方式。使用LINQ,解决方案非常优雅:

string str = new string(

Enumerable.Range(0, N)

.Select(i => (char)(‘A’ + i % 3))

.ToArray());

Petar Petrov给出了另外一种有趣的方式使用LINQ来生成字符串:

string values = string.Join(string.Empty, Enumerable.Repeat(pattern, N).ToArray());

5. 转换序列或集合

C#VB中我们不能实现把序列从T类型转换为U类型,即使TU类继承。因此,即使把List<string>转换为List<object>也很难实现。(要解释为什么,请看Bick Byer帖子)。但是如果要把IEnumerable<T>转换为IEnumerable<U>的话,LINQ有一个简单而有效的解决方案:

IEnumerable<string> strEnumerable = …;

IEnumerable<object> objEnumerable = strEnumerable.Cast<object>();

如果我们需要转换List<T>List<U>LINQ也提供了解决方案,但是它会进行列表的复制:

List<string> strList = …;

List<object> objList = new List<object>(strList.Cast<object>());

Chris Cavanagh建议另外一种解决方式:

var objList = strList.Cast<object>().ToList();

6. 把值转换为长度为1的序列

当我们需要把单个值转化为一个长度为1的序列时,会怎么做?我们可以创建一个长度为1的数组,但是我还是喜欢LINQRepeat操作:

IEnumerable<int> seq = Enumerable.Repeat(myValue, 1);

7. 遍历序列的所有子集

有的时候,遍历数组的所有子集很有用。子集和问题布尔可满足性问题以及背包问题都可以通过遍历某个序列的所有子集来简单解决。

有了LINQ,我们可以如下声场所有arr数组的子集:

T[] arr = ...;

var subsets = from m in Enumerable.Range(0, 1 << arr.Length)

select

from i in Enumerable.Range(0, arr.Length)

where (m & (1 << i)) != 0

select arr[i];

注意,如果子集的个数超过了int,上面的代码就不能工作。因此,仅当你知道arr的长度不超过30的时候才去使用这个方式。如果arr长度超过30,你应该不会是想去遍历所有的子集,因为可能这会耗费几分钟或更长的时间。

评论和总结

希望这些技巧对你有用,这些示例代码都使用C#实现,但是你可以很容易得改变为其它.NET语言。然而,LINQ对于支持扩展方法、lambda表达式和类型推断的语言更方便,比如C#VB。这里的每一段代码都可行,但是我不能保证什么,请在使用前仔细检查。

分享到:
评论

相关推荐

    使用LINQ来简化编程的7个技巧

    自从学习LINQ以来,我发现了很多使用LINQ来改善代码的方式。每一个技巧都让代码写起来更简单,可读性更强。 这里总结了这些技巧。我会介绍如何使用LINQ来:

    LINQ高级编程 6/7

    然后展示了如何在c#和Visual Basic中使用LINQ to XML编程,以及如何使用LINQ to XML处理其他数据模型;接下来依次介绍LINQ to SQL查询、高级查询概念、LINQ to Entities和LINQ to DataSets。所有这些颇具价值的见解...

    LINQ高级编程 2/7

    然后展示了如何在c#和Visual Basic中使用LINQ to XML编程,以及如何使用LINQ to XML处理其他数据模型;接下来依次介绍LINQ to SQL查询、高级查询概念、LINQ to Entities和LINQ to DataSets。所有这些颇具价值的见解...

    LINQ高级编程 part3

    LINQ高级编程 PDF版本,共69.4MB,分为3个分卷(应为超过60M所以分了3部分) 本书结合具体实例详述了LINQ高级编程所涉及的各个方面。共分为LINQ概述、LINQ to XML、LINQ to SQL及附录四大部分,每一部分的各个章节...

    LINQ中文版文档,LINQ 入门,LINQ 学习,LINQ编程指南

    包含指向相关主题的链接,这些主题说明如何使用 LINQ to Objects 来访问内存中的数据结构。 8.LINQ to XML 包含指向说明如何使用 LINQ to XML 的主题的链接,此功能可提供文档对象模型 (DOM) 的内存中文档修改 功能...

    linq高级编程

    查看本书要有一定的linq基础,本书讲解的内容linq to xml,linq to sql,linq to object的三大类的使用。详细而易懂,希望能助你在编程道路上一臂之力。

    LINQ 编程(C# 4.0)

    LINQ 编程(C# 4.0)LINQ 编程(C# 4.0)LINQ 编程(C# 4.0)LINQ 编程(C# 4.0)LINQ 编程(C# 4.0)LINQ 编程(C# 4.0)LINQ 编程(C# 4.0)LINQ 编程(C# 4.0)LINQ 编程(C# 4.0)LINQ 编程(C# 4.0)LINQ 编程...

    LINQ高级编程.7z.001

    LINQ高级编程,很不错的一本书,因为大小限制,只能分为2部分上传

    LINQ高级编程

    本书结合具体实例详述了LINQ高级编程所涉及的各个方面。共分为LINQ概述、LINQ to XML、LINQ to SQL及附录四大部分,每一部分的各个章节结构清晰,层次明显。本书并不是对一种新技术的简单介绍,而是力求使读者通过...

    LINQ技术及编程5

    LINQ技术及编程 5 学习LINQ专用

    [LINQ高级编程]

    [LINQ高级编程]图书源代码。大量LINQ 实例可以学习。

    LINQ高级编程 7/7

    然后展示了如何在c#和Visual Basic中使用LINQ to XML编程,以及如何使用LINQ to XML处理其他数据模型;接下来依次介绍LINQ to SQL查询、高级查询概念、LINQ to Entities和LINQ to DataSets。所有这些颇具价值的见解...

    高清 LINQ编程技术内幕

    高清 LINQ编程技术内幕

    LINQ编程技术内幕

    资源名称:LINQ编程技术内幕资源截图: 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。

    LINQ高级编程 1/7

    然后展示了如何在c#和Visual Basic中使用LINQ to XML编程,以及如何使用LINQ to XML处理其他数据模型;接下来依次介绍LINQ to SQL查询、高级查询概念、LINQ to Entities和LINQ to DataSets。所有这些颇具价值的见解...

    LINQ高级编程 5/7

    然后展示了如何在c#和Visual Basic中使用LINQ to XML编程,以及如何使用LINQ to XML处理其他数据模型;接下来依次介绍LINQ to SQL查询、高级查询概念、LINQ to Entities和LINQ to DataSets。所有这些颇具价值的见解...

    LINQ高级编程 4/7

    然后展示了如何在c#和Visual Basic中使用LINQ to XML编程,以及如何使用LINQ to XML处理其他数据模型;接下来依次介绍LINQ to SQL查询、高级查询概念、LINQ to Entities和LINQ to DataSets。所有这些颇具价值的见解...

    LINQ高级编程 3/7

    然后展示了如何在c#和Visual Basic中使用LINQ to XML编程,以及如何使用LINQ to XML处理其他数据模型;接下来依次介绍LINQ to SQL查询、高级查询概念、LINQ to Entities和LINQ to DataSets。所有这些颇具价值的见解...

    LINQ to XML 编程基础

    LINQ to XML 编程基础

Global site tag (gtag.js) - Google Analytics