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

调用表达式 ()

使用括号 () 调用()或调用委托。 以下示例演示如何在使用或不使用参数的情况下调用方法,以及调用委托:

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

 

 
posted @ 2023-04-07 10:28  Tammytan  阅读(279)  评论(0编辑  收藏  举报