请解释 C# 中 Enumerable.Range 和 Enumerable.Repeat 这两个方法的用途,并说明它们各自返回什么样的序列?
考察说明
考查候选人是否熟悉 LINQ 中常用的序列生成方法及其区别。
回答思路
- 【回答框架 1】Enumerable.Range 用于生成一个从指定起始值开始的连续整数序列,其方法签名为 Range(int start, int count),返回 IEnumerable<int>。它适用于需要快速创建一个整数范围进行循环或查询的场景,例如生成 1 到 100 的数字列表。
- 【回答框架 2】Enumerable.Repeat 用于生成一个包含指定元素重复指定次数的序列,方法签名为 Repeat<TResult>(TResult element, int count),返回 IEnumerable<T>。它适用于需要生成相同值的集合,例如初始化数组或填充默认值。
- 【回答框架 3】两者的共同点是都返回惰性求值的序列,即在实际枚举时才生成元素,因此当 count 较大时不会立即分配大量内存。但需要注意,如果传入的 count 为负数,两者都会抛出 ArgumentOutOfRangeException。
- 【回答框架 4】在应用层面,Range 常用于生成连续编号、分页或模拟数据,而 Repeat 常用于生成重复模式、填充测试数据或实现某种策略模式。两者结合使用可以灵活构造复杂的枚举集合。
- 【关键点 1】Range 生成起始值到起始值加 count 减一的连续整数序列。
- 【关键点 2】Repeat 生成指定元素重复 count 次的序列,元素类型可为任意引用或值类型。
- 【关键点 3】两者均为惰性求值,且 count 为负数时抛出 ArgumentOutOfRangeException。
- 【关键点 4】实际开发中 Range 用于生成数字范围,Repeat 用于生成重复元素集合。
- 【易错点 1】注意 Range 的 count 可能溢出或超出 int 范围,导致抛出 OverflowException。
- 【易错点 2】Repeat 在枚举前不会复制元素,若元素是可变引用类型,修改元素会影响所有序列项,但实际上 Repeat 会返回同一个实例,因此修改一个是修改所有,这可能是预期行为也可能造成混淆。
- 【易错点 3】不要混淆 Range 和 Enumerable.Range 与 Array.Range 或循环,在 LINQ 中它们返回的是可枚举序列而非数组。