zoukankan      html  css  js  c++  java
  • [翻译]Linq 的 7 个技巧简化程序操作

    原文:7 tricks to simplify your programs with LINQ

    1. 初始化数组

    int[] a = Enumerable.Repeat(-110).ToArray();
    int[] b = Enumerable.Range(010).ToArray();
    int[] c = Enumerable.Range(010).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(01 << 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();

    这个比较难理解一点。
  • 相关阅读:
    494 Target Sum 目标和
    493 Reverse Pairs 翻转对
    492 Construct the Rectangle 构建矩形
    491 Increasing Subsequences 递增子序列
    488 Zuma Game 祖玛游戏
    486 Predict the Winner 预测赢家
    485 Max Consecutive Ones 最大连续1的个数
    483 Smallest Good Base
    Django Form组件
    Django Auth组件
  • 原文地址:https://www.cnblogs.com/RChen/p/1205683.html
Copyright © 2011-2022 走看看