• [翻译]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();

    这个比较难理解一点。
  • 相关阅读:
    Shell笔记——文本操作
    Shell笔记——加密命令
    conda,pip 安装指定版本的指定包
    如何检查tensorflow环境是否能正常调用GPU
    Windows10中使用Anaconda安装keras-gpu版本(遇到的坑)
    canvas一些属性
    块级元素,行内元素,行内块级元素都有哪些
    面向对象版Tab栏切换
    注册事件的兼容性处理
    常见的移动端问题
  • 原文地址:https://www.cnblogs.com/RChen/p/1205683.html
Copyright © 2020-2023  润新知