无名商城论坛

搜索
查看: 278|回复: 0

[其他技术] 【LSP】C# 中居然也有切片语法糖,太厉害了

[复制链接]

1万

主题

1万

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
32464
发表于 2022-5-8 17:02:49 | 显示全部楼层 |阅读模式


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

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

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

1. 提取 arr 前3个元素
如果用 linq 的话,可以用 Take(3),用切片操作的话就是 [0..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[0..3];

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

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


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)}");
        }


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[4..7];

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

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


从上面的切割区间 [4..7] 的输出结果来看,这是一个 左闭右开 的区间,所以要特别注意一下。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表