Range 类型与 .. 运算符
使用范围表达式获取切片。
Range 类型与 .. 运算符 是 CoddyKit 上的免费 C# Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C# Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C# Academy 课程共包含 4 节课。
认识 Range 类型
System.Range 使用一个起始 Index 和一个结束 Index 描述序列中的一个 slice。它与范围运算符 .. 配合得非常好,可以清晰地表示子序列。
using System;
Range r = 1..3;
Console.WriteLine(r.Start + ".." + r.End); // 1..3..(范围)运算符
范围运算符 a..b 会创建一个 Range,从索引 a(包含)到索引 b(不包含)。因此,1..3 覆盖位置 1 和 2。
using System;
int[] data = { 10, 20, 30, 40, 50 };
int[] slice = data[1..3];
Console.WriteLine(string.Join(",", slice)); // 20,30起始位置包含,结束位置不包含
不包含结束位置的规则与 for 循环的工作方式一致:元素数量等于 end - start。范围 2..5 会产生三个元素。
using System;
int[] data = { 0, 1, 2, 3, 4, 5, 6 };
int[] slice = data[2..5];
Console.WriteLine(slice.Length); // 3
Console.WriteLine(string.Join(",", slice)); // 2,3,4开放范围
您可以省略任意一侧的边界。..3 表示“从开头到 3”,2.. 表示“从 2 到末尾”。单独的 .. 会复制整个序列。
using System;
int[] d = { 10, 20, 30, 40, 50 };
Console.WriteLine(string.Join(",", d[..3])); // 10,20,30
Console.WriteLine(string.Join(",", d[2..])); // 30,40,50
Console.WriteLine(string.Join(",", d[..])); // 10,20,30,40,50结合从末尾索引的范围
将 .. 与 ^ 结合使用,可以相对于末尾创建 slice。^2.. 表示“最后两个元素”。
using System;
int[] d = { 1, 2, 3, 4, 5 };
Console.WriteLine(string.Join(",", d[^2..])); // 4,5
Console.WriteLine(string.Join(",", d[..^1])); // 1,2,3,4 (drop last)Range 作为存储值
Range 是一个可以命名并重复使用的值,适用于遵循相同长度约定的不同集合。
using System;
Range middle = 1..^1; // drop first and last
int[] a = { 0, 1, 2, 3, 4 };
Console.WriteLine(string.Join(",", a[middle])); // 1,2,3Range.GetOffsetAndLength
要根据具体长度解析范围,请调用 GetOffsetAndLength(length)。它会返回起始偏移量和 slice 长度,并自动处理从末尾开始的索引。
using System;
Range r = ^3..^1;
var (offset, length) = r.GetOffsetAndLength(5);
Console.WriteLine(offset + " " + length); // 2 2Range.All
静态成员 Range.All 与 .. 等效,用于选择整个序列。在将范围作为参数传递时,它非常方便。
using System;
Range whole = Range.All;
int[] d = { 9, 8, 7 };
Console.WriteLine(string.Join(",", d[whole])); // 9,8,7显式构造 Range
除了使用运算符,您还可以调用构造函数,或调用工厂方法 Range.StartAt 和 Range.EndAt,使代码更加清晰。
using System;
Range a = new Range(1, 3);
Range b = Range.StartAt(2);
Range c = Range.EndAt(2);
Console.WriteLine(a + " | " + b + " | " + c);空范围与无效范围
起始位置等于结束位置的范围会产生空的 slice。起始位置在结束位置之后的范围,在解析后进行 slice 时会引发异常。
using System;
int[] d = { 1, 2, 3, 4 };
Console.WriteLine(d[2..2].Length); // 0 (empty)
try { var _ = d[3..1]; }
catch (ArgumentOutOfRangeException) { Console.WriteLine("invalid range"); }综合运用
范围让文本和数组处理更加简洁。在这里,我们无需进行任何索引算术运算,就能获取数组中间的一段窗口。
using System;
int[] readings = { 5, 7, 9, 11, 13, 15 };
int[] window = readings[1..^1];
Console.WriteLine(string.Join(",", window)); // 7,9,11,13快速检查
请确保您理解范围运算符的语义。
回顾
您已经学会了,System.Range 使用 .. 运算符描述一个 slice。
- 起始位置包含,结束位置不包含:数量 = end - start。
- 边界可以省略:
..3、2..、..。 ..可以与^结合,实现从末尾开始的 slice。GetOffsetAndLength(length)会将范围解析为具体数值。
常见问题解答
「Range 类型与 .. 运算符」课时是免费的吗?
是的 — 「Range 类型与 .. 运算符」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C# Academy 课程的其余内容,请升级到 CoddyKit PRO。 C# Academy 课程共包含 4 节课。
「Range 类型与 .. 运算符」这节课中我会学到什么?
使用范围表达式获取切片。 你通过在浏览器中直接运行的动手代码来练习 C# Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 C# Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 C# Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「Range 类型与 .. 运算符」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 C# Academy 课中编写并运行代码吗?
能。每节 C# Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- Index 类型与 ^ 运算符
- Range 类型与 .. 运算符
- 数组和字符串中的范围
- 支持范围的自定义类型