末尾运算符 ^ 和 范围运算符 ..
调用表达式 ()
使用括号 () 调用()或调用委托。 以下示例演示如何在使用或不使用参数的情况下调用方法,以及调用委托:
Action<int> display = s => Console.WriteLine(s); var numbers = new List<int>(); numbers.Add(10); numbers.Add(17); display(numbers.Count); // output: 2 numbers.Clear(); display(numbers.Count); // output: 0
() 的其他用法:
此外可以使用括号来调整表达式中计算操作的顺序。
强制转换表达式,其执行显式类型转换,也可以使用括号。
int a, b, c; a = 7; b = a; c = b++; b = a + b * c; c = a >= 100 ? b : c / 10; a = (int)Math.Sqrt(b * b + c * c); string s = "String literal"; char l = s[s.Length - 1]; var numbers = new List<int>(new[] { 1, 2, 3 }); b = numbers.FindLast(n => n > 1);
从末尾运算符 ^ 开始索引
^ 运算符指示序列末尾的元素位置。 对于长度为 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。 还可以将 ^ 运算符与^一起使用以创建一个索引范围。 有关详细信息,请参阅索引和范 围。
范围运算符 ..
.. 运算符指定某一索引范围的开头和末尾作为其操作数。 左侧操作数是范围的包含性开 头。 右侧操作数是范围的不包含性末尾。 任一操作数都可以是序列开头或末尾的索引, 如以下示例所示:
int[] numbers = new[] { 0, 10, 20, 30, 40, 50 }; int start = 1; int amountToTake = 3; int[] subset = numbers[start..(start + amountToTake)]; Display(subset); // output: 10 20 30 int margin = 1; int[] inner = numbers[margin..^margin]; 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 的结果必须隐式转换为 Int32 或 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));
下表显示了表达集合范围的各种方法:
int[] oneThroughTen = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; Write(oneThroughTen, ..); Write(oneThroughTen, ..3); Write(oneThroughTen, 2..); Write(oneThroughTen, 3..5); Write(oneThroughTen, ^2..); Write(oneThroughTen, ..^3); Write(oneThroughTen, 3..^4); Write(oneThroughTen, ^4..^2); static void Write(int[] values, Range range) => Console.WriteLine($"{range}:\t{string.Join(", ", values[range])}");
// Sample output: // 0..^0: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 // 0..3: 1, 2, 3 // 2..^0: 3, 4, 5, 6, 7, 8, 9, 10 // 3..5: 4, 5 // ^2..^0: 9, 10 // 0..^3: 1, 2, 3, 4, 5, 6, 7 // 3..^4: 4, 5, 6 // ^4..^2: 7, 8