|
4. 生成字符串 LINQ同样也是生成各种类型字符串的好工具。对于测试或调试,生成字符串时很有用的。假设我们需要生成一个N长度的字符串,按照“ABCABCABC”的方式。使用LINQ,解决方案非常优雅: string str = new string( Enumerable.Range(0, N) .Select(i => (char)(‘A’ + i % 3)) .ToArray()); 5. 转换序列或集合 在C#或VB中我们不能实现把序列从T类型转换为U类型,即使T从U类继承。因此,即使把List转换为List 如果我们需要转换List为List,LINQ也提供了解决方案,但是它会进行列表的复制: List strList = …; ListobjList = new List(strList.Cast()); 6. 把值转换为长度为1的序列 当我们需要把单个值转化为一个长度为1的序列时,会怎么做?我们可以创建一个长度为1的数组,但是我还是喜欢LINQ的Repeat操作: IEnumerable 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。这里的每一段代码都可行,但是我不能保证什么,请在使用前仔细检查。
|