末尾运算符 ^和范围运算符 .

从末尾运算符 ^ 开始索引

^ 运算符在 C# 8.0 和更高版本中提供,指示序列末尾的元素位置。

  • 对于长度为 length 的序列,^n 指向与序列开头偏移 length - n 的元素。

例如:

  • ^1 指向序列的最后一个元素,
  • ^length 指向序列的第一个元素。
int[] xs = new[] { 0, 10, 20, 30, 40 };
int last = xs[^1];
Console.WriteLine(last);  // output: 40

var lines = new List<string> { "one", "two", "three", "four" };
string prelast = lines[^2];
Console.WriteLine(prelast);  // output: three

string word = "Twenty";
Index toFirst = ^word.Length;
char first = word[toFirst];
Console.WriteLine(first);  // output: T

如前面的示例所示,表达式 ^e 属于 System.Index 类型。
在表达式 ^e 中,e 的结果必须隐式转换为 int。

还可以将 ^ 运算符与范围运算符一起使用以创建一个索引范围。


范围运算符 .

… 运算符在 C# 8.0 和更高版本中提供,指定索引范围的开头和末尾作为其操作数。

  • 左侧操作数是范围的包含性开头。
  • 右侧操作数是范围的包含性末尾。

任一操作数都可以是序列开头或末尾的索引,如以下示例所示:

int[] numbers = new[] { 0, 10, 20, 30, 40, 50 };
int start = 1;
int amountToTake = 3;
int[] subset = numbers[start..(start + amountToTake)];
不包含 下标=4
Display(subset);  // output: 10 20 30

int margin = 1;
int[] inner = numbers[margin..^margin]; 
//[ 下标1-4,不包含最后一个数字 => ^-1=下标5]
Display(inner);  // output: 10 20 30 40

string line = "one two three";
int amountToTakeFromEnd = 5;
Range endIndices = ^amountToTakeFromEnd..^0;
string end = line[endIndices];
Console.WriteLine(end);  // output: three

void Display<T>(IEnumerable<T> xs) => Console.WriteLine(string.Join(" ", xs));

如前面的示例所示,表达式 a…b 属于 System.Range 类型。 在表达式 a…b 中,a 和 b 的结果必须隐式转换为 int 或 Index。

可以省略 … 运算符的任何操作数来获取无限制范围:

a.. 等效于 a..^0
..b 等效于 0..b
.. 等效于 0..^0
int[] numbers = new[] { 0, 10, 20, 30, 40, 50 };
int amountToDrop = numbers.Length / 2;

int[] rightHalf = numbers[amountToDrop..];
Display(rightHalf);  // output: 30 40 50

int[] leftHalf = numbers[..^amountToDrop];
Display(leftHalf);  // output: 0 10 20

int[] all = numbers[..];
Display(all);  // output: 0 10 20 30 40 50

void Display<T>(IEnumerable<T> xs) => Console.WriteLine(string.Join(" ", xs));

运算符可重载性

.、()、^ 和 … 运算符无法进行重载。 [] 运算符也被视为非可重载运算符。 使用索引器以支持对用户定义的类型编制索引。

你可能感兴趣的:(C#编程)