[翻译]Linq 的 7 个技巧简化程序操作

原文: 7 tricks to simplify your programs with LINQ

1. 初始化数组

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

注意点:
    这个方法可以避免 for 循环;
    Linq 会动态的产生数组,因此垃圾数组可能在运行时才得到清理,要构造很大的数组,还是用常规的 for 循环比较好。

2. 用一个循环枚举多个数组

普通做法:
foreach  (var x  in  array1) {
    DoSomething(x);
}

foreach  (var x  in  array2) {
    DoSomething(x);
}

技巧:
foreach  (var x  in  array1.Concat(array2)) {
    DoSomething(x);
}

3. 生成长度为 N 的随机序列

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

4. 生成字符串

生成长度为 N 的 "ABCABC.." 字符串:
string  str  =   new   string (
    Enumerable.Range(
0 , N)
    .Select(i 
=>  ( char )(‘A’  +  i  %   3 ))
    .ToArray());

另一个例子:
string  values  =   string .Join( string .Empty, Enumerable.Repeat(pattern, N).ToArray());

5. 转换序列或集合

在 C#/VB 中不允许直接将一个类型 T 的序列转换为另一个类型 U 的序列,即使 U 是 T 的父类也不行。这是因为如果允许这样,就可能会产生运行时异常。但用 Linq 可以有一些方法来做类似的转换:

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

要转换 List<T> 必须通过复制:

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

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

6. 将一个值转换为仅包含它的长度为1的序列

可以创建数组,但用 IEnumerable 会更通用:
IEnumerable < int >  seq  =  Enumerable.Repeat(myValue,  1 );

7. 遍历序列的全部子集

可以用来解背包问题等。
            var arr  =   new   string [] {  " foo " " bar " " xxx "  };

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

            
foreach  (var subset  in  subsets)
            {
                
foreach  (var element  in  subset)
                {
                    Console.Write(element 
+   "   " );
                }
                Console.Write(
" /n " );
            }

            Console.ReadLine();

这个比较难理解一点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值