在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.Index
和System.Range
类型。这意味着你可能需要在你的集合类中添加一些额外的方法或属性。
实现GetSubArray
例如,你可以通过实现一个GetSubArray
方法来支持范围运算符:
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();
}
实现Index
的GetOffset
对于Index
类型,你需要实现一个GetOffset
方法,它将Index
转换为数组的索引:
public int GetOffset(int length)
{
if (this.fromEnd)
return length - this.value;
return this.value;
}