自从学习LINQ以来我发现了很多使用LINQ来改善代码的方式每一个技巧都让代码写起来更简单可读性更强 这里总结了这些技巧我会介绍如何使用LINQ来 ◆初始化数组 ◆在一个循环中遍历多个数组 ◆生成随机序列 ◆生成字符串 ◆转换序列或集合 ◆把值转换为长度为的序列 ◆遍历序列的所有子集 如果你在LINQ方面有心得也欢迎在评论中一起分享 初始化数组 通常我们需要把数组的值初始化为相同的值或递增的序列值或者可能是一个步进不为的递增/递减序列有了LINQ我们可以在数组的初始化器中完成所有工作不再需要循环! 在如下的示例代码中第一行代码初始化了一个长度为的数组所有元素都是第二行代码初始化b为到第三行代码初始化c为到 int[] a = EnumerableRepeat( )ToArray();int[] b = EnumerableRange( )ToArray();int[] c = EnumerableRange( )Select(i => + * i)ToArray(); 要提醒一下如果你初始化一个很大的数组最好不考虑这种优雅的方式而是使用传统的方式来替代LINQ的这种解决方案会动态产生数组因此垃圾数组需要在运行时被回收也就是说我总是会在小数组或测试调试代码的情况下使用这种技巧 在一个循环中遍历多个数组 有个朋友问我一个C#的问题有没有办法在一个循环中遍历多个集合?他的代码差不多是这样 foreach (var x in array) { DoSomething(x);} foreach (var x in array) { DoSomething(x);} 这样的话循环主体会很大而且他也不希望这样重复的代码但是他又不希望创建一个数组来保存array和array的所有元素 LINQ提供了一种优雅的解决方案Concat操作我们可以使用单个循环来重写上面的代码如下 foreach (var x in arrayConcat(array)) { DoSomething(x);} 注意由于LINQ在枚举器级别进行操作他不会产生新的数组来保存array和array的元素因此除了优雅之外这个方案还很高效 生成随机序列 这是一个生成N长度随机序列的简单技巧 Random rand = new Random();var randomSeq = EnumerableRepeat( N)Select(i => randNext()); 有了LINQ的延迟特性序列不会实现进行计算并保存到数组中而是在迭代randomSeq的时候按需生成随机数 生成字符串 LINQ同样也是生成各种类型字符串的好工具对于测试或调试生成字符串时很有用的假设我们需要生成一个N长度的字符串按照ABCABCABC的方式使用LINQ解决方案非常优雅 string str = new string( EnumerableRange( N) Select(i => (char)(A + i % )) ToArray()); Petar Petrov给出了另外一种有趣的方式使用LINQ来生成字符串 string values = stringJoin(stringEmpty EnumerableRepeat(pattern N)ToArray()); 转换序列或集合 在C#或VB中我们不能实现把序列从T类型转换为U类型即使T从U类继承因此即使把List转换为List |