C# Academy · 课时

Index 类型与 ^ 运算符

从集合末尾引用元素。

第 1 / 4 课13 个步骤

Index 类型与 ^ 运算符 是 CoddyKit 上的免费 C# Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C# Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C# Academy 课程共包含 4 节课。

认识 Index 类型

C# 提供了专用的 System.Index 类型,用于描述序列中的位置。与普通的 int 不同,Index 不仅可以表示从集合开头开始计算的位置,还可以表示从集合末尾开始计算的位置。

这样一来,像“给我最后一个元素”这样的代码既直观又安全。

using System;

int[] numbers = { 10, 20, 30, 40, 50 };
Index first = 0;
Console.WriteLine(numbers[first]); // 10

^(从末尾)运算符

尖帽运算符 ^ 会构造一个从末尾开始计数的 Index。^1 表示最后一个元素,^2 表示倒数第二个元素,依此类推。

请注意,^1 是最后一个有效索引,而 ^0 等于 Length,表示末尾之后的位置。

using System;

int[] numbers = { 10, 20, 30, 40, 50 };
Console.WriteLine(numbers[^1]); // 50 (last)
Console.WriteLine(numbers[^2]); // 40

Index 作为一等值

Index 是一个真正的值,您可以将它存储在变量中、传递给方法并重复使用。这样可以将位置与集合分离开来。

using System;

int[] data = { 1, 2, 3, 4, 5 };
Index last = ^1;
Index secondLast = ^2;
Console.WriteLine(data[last]);       // 5
Console.WriteLine(data[secondLast]); // 4

IsFromEnd 与 Value

每个 Index 都提供两个属性:Value(整数偏移量)和 IsFromEnd(表示它是否使用 ^ 创建)。

using System;

Index fromStart = 2;
Index fromEnd = ^2;
Console.WriteLine(fromStart.Value + " " + fromStart.IsFromEnd); // 2 False
Console.WriteLine(fromEnd.Value + " " + fromEnd.IsFromEnd);     // 2 True

GetOffset 解析位置

只有知道集合长度后,从末尾开始计算的索引才有意义。Index.GetOffset(length) 会将它转换为具体的、从 0 开始计算的偏移量。

using System;

Index fromEnd = ^1;
int length = 5;
int offset = fromEnd.GetOffset(length);
Console.WriteLine(offset); // 4

^0 位于末尾之后

由于 ^0 会解析为 Length,使用它进行索引会引发异常。它仅适合作为范围的不包含在内的上界,您将在下一课中看到这一点。

using System;

int[] data = { 1, 2, 3 };
try {
    Console.WriteLine(data[^0]); // out of range!
} catch (IndexOutOfRangeException) {
    Console.WriteLine("^0 is past the end");
}

Index 适用于多种集合

任何具有索引器以及 Length 或 Count 属性,并提供相应支持的类型,都可以使用 Index。数组、string 和 Span<T> 都可以直接使用。

using System;

string word = "Coddy";
Console.WriteLine(word[^1]); // y
Console.WriteLine(word[^5]); // C

动态计算索引

您可以对变量使用 ^ 运算符,从运行时整数构造一个 Index。

using System;

int[] data = { 5, 10, 15, 20 };
int n = 2;
Index idx = ^n;            // ^ works on variables too
Console.WriteLine(data[idx]); // 15

Index 与普通 int

普通的 int 始终从开头开始计数。Index 增加了从末尾开始计数的能力,同时仍可从 int 隐式转换,因此现有代码可以继续工作。

using System;

Index a = 1;   // implicit from int
Index b = ^1;  // from end
Console.WriteLine(a.IsFromEnd); // False
Console.WriteLine(b.IsFromEnd); // True

避免差一错误

过去,要访问最后一个元素,需要写成 arr[arr.Length - 1]。使用 ^1 后,意图更加明确,也不再需要担心算术计算出错。

using System;

int[] scores = { 88, 92, 79, 95 };
Console.WriteLine(scores[scores.Length - 1]); // old way: 95
Console.WriteLine(scores[^1]);                // new way: 95

实际代码中的 Index

下面是一个小型辅助函数,它使用 ^1 返回任意数组中的最后一项,让调用位置保持简洁。

using System;

static T Last<T>(T[] items) => items[^1];

int[] nums = { 3, 6, 9, 12 };
Console.WriteLine(Last(nums)); // 12

快速检查

检验您对 Index 类型和 ^ 运算符的理解。

回顾

您已经学会了,System.Index 表示一个位置:它可以从开头开始计数,也可以借助 ^ 运算符从末尾开始计数。

  • ^1 表示最后一个元素;^0 等于 Length,表示末尾之后的位置。
  • Index 提供 Value、IsFromEnd 和 GetOffset(length)。
  • 它可以从 int 隐式转换,并适用于数组、字符串和跨度。
免费开始

用 AI 导师学习 C# — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
93
课程
346

常见问题解答

「Index 类型与 ^ 运算符」课时是免费的吗?

是的 — 「Index 类型与 ^ 运算符」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C# Academy 课程的其余内容,请升级到 CoddyKit PRO。 C# Academy 课程共包含 4 节课。

「Index 类型与 ^ 运算符」这节课中我会学到什么?

从集合末尾引用元素。 你通过在浏览器中直接运行的动手代码来练习 C# Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 C# Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 C# Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「Index 类型与 ^ 运算符」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 C# Academy 课中编写并运行代码吗?

能。每节 C# Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. Index 类型与 ^ 运算符
  2. Range 类型与 .. 运算符
  3. 数组和字符串中的范围
  4. 支持范围的自定义类型
← 返回 C# Academy