无名 发表于 2022-5-8 17:02:49

【LSP】C# 中居然也有切片语法糖,太厉害了


http://cdn.u1.huluxia.com/g4/M01/65/38/rBAAdl91O9OARYD7AACt4WdlvYs558.jpg
一:背景
1. 讲故事
昨天在 github 上准备找找 C# 9 又有哪些新语法糖可以试用,不觉在一个文档上看到一个很奇怪的写法: foreach (var item in myArray) 哈哈,熟悉又陌生,玩过python的朋友对这个 太熟悉不过了,居然在 C# 中也遇到了,开心哈,看了下是 C# 8 的新语法,讽刺讽刺,8 都没玩熟就搞 9 了,我的探索欲比较强,总想看看这玩意底层是由什么支撑的。

二:.. 语法糖的用法
从前面介绍的 myArray 语义上也能看出,这是一个切分array的操作,那到底有几种切分方式呢? 下面一个一个来介绍,为了方便演示,我先定义一个数组,代码如下:

var myarr = new string[] { "10", "20", "30", "40", "50", "60", "70", "80", "90", "100" };

1. 提取 arr 前3个元素
如果用 linq 的话,可以用 Take(3),用切片操作的话就是 , 代码如下:

      static void Main(string[] args)
      {
            var myarr = new string[] { "10", "20", "30", "40", "50", "60", "70", "80", "90", "100" };

            //1. 获取数组 前3个元素
            var query1 = myarr;

            var query2 = myarr.Take(3).ToList();

            Console.WriteLine($"query1={string.Join(",", query1)}");
            Console.WriteLine($"query2={string.Join(",", query2)}");
      }
http://cdn.u1.huluxia.com/g4/M01/65/38/rBAAdl91O9SAQwfEAAAPMBp5ijk684.png

2. 提取 arr 最后三个元素
这个怎么提取呢?在 python 中直接用 -3 表示就可以了,在C# 中需要用 ^ 来表示从末尾开始,代码如下:

      static void Main(string[] args)
      {
            var myarr = new string[] { "10", "20", "30", "40", "50", "60", "70", "80", "90", "100" };

            //1. 获取数组 最后3个元素
            var query1 = myarr[^3..];

            var query2 = myarr.Skip(myarr.Length - 3).ToList();

            Console.WriteLine($"query1={string.Join(",", query1)}");
            Console.WriteLine($"query2={string.Join(",", query2)}");
      }

http://cdn.u1.huluxia.com/g4/M01/65/38/rBAAdl91O9WAcrblAAAQuhZakXo329.png
3. 提取 array 中index = 4,5,6 的三个位置元素
用 linq 的话,就需要使用 Skip + Take 双组合,如果用切片操作的话就太简单了。。。

      static void Main(string[] args)
      {
            var myarr = new string[] { "10", "20", "30", "40", "50", "60", "70", "80", "90", "100" };

            //1. 获取数组 中 index=4,5,6 三个位置的元素
            var query1 = myarr;

            var query2 = myarr.Skip(4).Take(3).ToList();

            Console.WriteLine($"query1={string.Join(",", query1)}");
            Console.WriteLine($"query2={string.Join(",", query2)}");
      }
http://cdn.u1.huluxia.com/g4/M01/65/38/rBAAdl91O9WANhsLAAAPqYKiQy8789.png

从上面的切割区间 的输出结果来看,这是一个 左闭右开 的区间,所以要特别注意一下。http://cdn.u1.huluxia.com/g4/M01/65/38/rBAAdl91O9aALRdYAATNh7wtfdo487.jpg
页: [1]
查看完整版本: 【LSP】C# 中居然也有切片语法糖,太厉害了