C#面试题更新 2026-08-05

请解释 C# 中 Enumerable.Range 和 Enumerable.Repeat 这两个方法的用途,并说明它们各自返回什么样的序列?

技术原理C#LINQ

考察说明

考查候选人是否熟悉 LINQ 中常用的序列生成方法及其区别。

回答思路

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