您好,登录后才能下订单哦!
本篇内容介绍了“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(); 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类型,即使t从u类继承。因此,即使把list转换为list,如果我们需要转换list为list,linq组合查询也提供了解决方案,但是它会进行列表的复制:
list strlist = …; listobjlist = new list(strlist.cast());
chris cavanagh建议另外一种解决方式:
var objlist = strlist.cast().tolist();
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,你应该不会是想去遍历所有的子集,因为可能这会耗费几分钟或更长的时间。
“LINQ组合查询怎么简化编程”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。