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

请阐述在 C# 编程语言中,ICollection<T> 和 IList<T> 接口之间的主要区别,并说明它们各自适用的场景。

技术原理方案权衡C#

考察说明

考察应聘者对 C# 泛型集合接口层次结构的理解,以及根据场景选择合适接口的能力。

回答思路

  1. 【回答框架 1】ICollection<T> 继承自 IEnumerable<T>,作为泛型集合的基接口,提供了集合的基本操作,如 Count 属性获取元素数量,Add 和 Remove 方法添加和移除元素,以及 Contains 方法判断元素是否存在。它不保证元素的有序性。
  2. 【回答框架 2】IList<T> 继承自 ICollection<T>、IEnumerable<T> 和 IEnumerable,在基接口基础上增加了索引操作。通过索引器 this[int] 支持按索引访问元素,还提供了 Insert 和 RemoveAt 方法,用于在指定位置插入或删除元素,从而支持对元素位置的控制。
  3. 【回答框架 3】主要区别在于 IList<T> 增加了索引相关的操作,使得元素具有明确的顺序,且可直接通过位置访问和修改元素。而 ICollection<T> 只能使用 Add 和 Remove 方法,不保证顺序,也不支持索引访问。
  4. 【回答框架 4】在选择接口时,如果只需要遍历集合并添加或移除元素,而不关心索引,则应使用 ICollection<T>;如果需要按索引访问、插入或删除元素,则应使用 IList<T>。例如,List<T> 实现了 IList<T>,而 HashSet<T> 实现的是 ICollection<T>,因为 HashSet 无序,不支持索引。
  5. 【关键点 1】ICollection<T> 提供了基础的集合操作,如 Count、Add、Remove 和 Contains。
  6. 【关键点 2】IList<T> 继承 ICollection<T>,增加了索引器、Insert 和 RemoveAt,支持有序访问。
  7. 【关键点 3】IList<T> 适合需要索引操作的场景,ICollection<T> 适合无序集合。
  8. 【关键点 4】List<T> 和数组实现了 IList<T>,而 HashSet<T> 只实现 ICollection<T>。
  9. 【易错点 1】混淆两个接口,误认为 ICollection<T> 支持索引访问。
  10. 【易错点 2】在需要随机访问时使用了 ICollection<T>,导致无法实现功能或需要额外转换。
  11. 【易错点 3】忽视了 IList<T> 和 ICollection<T> 的继承关系,误以为它们是独立的。