C#的范围运算符
在C# 8.0中,引入了两个新的运算符:范围运算符(…)和来自末尾的索引运算符(^),它们极大地简化了数组和字符串的索引和切片操作。这些新特性提供了一种更直观、更声明式的方式来处理集合中的元素。
范围运算符(…)
范围运算符允许你定义一个序列的子集,它的语法非常直观。例如,arr[1…4]会获取数组arr中从索引1到索引3的元素(即第二个到第四个元素,因为索引是从0开始的)。
基本用法
var array = new int[] { 1, 2, 3, 4, 5 };
var subArray = array[1…4]; // 获取从索引1到索引3的元素,即 { 2, 3, 4 }
省略边界
你还可以在范围表达式中省略开始或结束边界:
var allElements = array[…]; // 获取所有元素
var firstElements = array[…3]; // 获取从开始到索引2的元素
var lastElements = array[3…]; // 获取从索引3到末尾的元素
来自末尾的索引运算符(^)
这个运算符允许你从序列的末尾开始索引,^1表示最后一个元素,^2表示倒数第二个元素,依此类推。
基本用法
var lastElement = array[^1]; // 获取最后一个元素,等同于array[array.Length - 1]
var secondToLast = array[^2]; // 获取倒数第二个元素
结合使用
你可以将这两个运算符结合使用,以非常灵活的方式获取数组或字符串的子集。
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;
}
- 点赞
- 收藏
- 关注作者
评论(0)