请解释 C# 中 KeyedCollection 类的核心用途,并说明在实际代码中该如何初始化、添加元素以及按键进行访问?
考察说明
考查对 C# 泛型集合 KeyedCollection 的理解和实际使用能力。
回答思路
- 【回答框架 1】KeyedCollection 是 System.Collections.ObjectModel 命名空间下的抽象泛型类,它结合了 IList<T> 的索引访问和 IDictionary<TKey,TValue> 的键访问特性,要求每个元素必须能通过一个键来唯一标识,通常需要继承并重写 GetKeyForItem 方法来定义键提取逻辑。
- 【回答框架 2】在实际使用中,先定义元素类和键选择逻辑,创建 KeyedCollection 的派生类并实现 GetKeyForItem,然后就可以通过 Add 方法添加元素,添加时自动提取键并建立映射,之后既可以用索引访问,也可以用键直接访问,例如 collection[key] 或 Contains(key)。
- 【回答框架 3】KeyedCollection 内部维护键到索引的映射,使得按键查找的时间复杂度接近 O(1),同时保持列表的有序性,适合需要按键快速查找且保持插入顺序的场景。
- 【回答框架 4】使用时需要注意键的唯一性,添加重复键会抛出异常;如果元素属性在添加后发生变化导致生成键改变,内部映射不会自动更新,可能导致不一致。
- 【回答框架 5】构建自定义集合时,可通过构造函数指定字典初始容量或相等比较器,以优化性能和自定义键比较方式。
- 【关键点 1】KeyedCollection 是抽象类,必须派生并重写 GetKeyForItem。
- 【关键点 2】它同时支持按索引和按键访问元素。
- 【关键点 3】添加元素时自动提取键并建立映射,按键查找高效。
- 【关键点 4】键必须唯一,重复键会抛异常。
- 【关键点 5】元素键在添加后变化不会更新内部映射,需谨慎设计。
- 【易错点 1】忽略键的唯一性,添加重复键导致运行时异常。
- 【易错点 2】未重写 GetKeyForItem,无法实例化或编译错误。
- 【易错点 3】修改元素的键属性而不重新创建集合,导致按旧键无法访问。