C#的范围运算符

2024-10-09 22:40:44 浏览数 (3)

在C# 8.0中,引入了两个新的运算符:范围运算符(..)和来自末尾的索引运算符(^),它们极大地简化了数组和字符串的索引和切片操作。这些新特性提供了一种更直观、更声明式的方式来处理集合中的元素。

范围运算符(..)

范围运算符允许你定义一个序列的子集,它的语法非常直观。例如,arr[1..4]会获取数组arr中从索引1到索引3的元素(即第二个到第四个元素,因为索引是从0开始的)。

基本用法

代码语言:javascript复制
var array = new int[] { 1, 2, 3, 4, 5 };
var subArray = array[1..4]; // 获取从索引1到索引3的元素,即 { 2, 3, 4 }

省略边界

你还可以在范围表达式中省略开始或结束边界:

代码语言:javascript复制
var allElements = array[..];    // 获取所有元素
var firstElements = array[..3]; // 获取从开始到索引2的元素
var lastElements = array[3..];  // 获取从索引3到末尾的元素

来自末尾的索引运算符(^)

这个运算符允许你从序列的末尾开始索引,^1表示最后一个元素,^2表示倒数第二个元素,依此类推。

基本用法

代码语言:javascript复制
var lastElement = array[^1]; // 获取最后一个元素,等同于array[array.Length - 1]
var secondToLast = array[^2]; // 获取倒数第二个元素

结合使用

你可以将这两个运算符结合使用,以非常灵活的方式获取数组或字符串的子集。

代码语言:javascript复制
var lastThreeElements = array[^3..]; // 获取最后三个元素
var middleElements = array[1..^2];   // 获取从第二个元素到倒数第二个元素的范围

在自定义集合中使用

为了在自定义集合中使用这些运算符,你的集合需要支持System.IndexSystem.Range类型。这意味着你可能需要在你的集合类中添加一些额外的方法或属性。

实现GetSubArray

例如,你可以通过实现一个GetSubArray方法来支持范围运算符:

代码语言:javascript复制
public static T[] GetSubArray<T>(T[] array, Range range)
{
    int start = range.Start.GetOffset(array.Length);
    int length = range.End.GetOffset(array.Length) - start;
    return array.Skip(start).Take(length).ToArray();
}

实现IndexGetOffset

对于Index类型,你需要实现一个GetOffset方法,它将Index转换为数组的索引:

代码语言:javascript复制
public int GetOffset(int length)
{
    if (this.fromEnd)
        return length - this.value;
    return this.value;
}

1 人点赞