C#泛型接口扩展方法Indexing习题入门思路求助
C# 习题入门思路提示
先扫清I<T>泛型接口的认知盲区
- 这个接口的定义非常简单,只约定了一件事:所有实现了
I<T>的类型,都必须暴露一个类型为T、可读的属性P,没有其他隐藏逻辑。 - 你如果要写测试用例,完全可以自己写个简单的实现类,不用想复杂:
// 题目示例用的枚举 enum Day { Mo, Tu, We, Th, Fr } // 对应接口的测试实现类 class TestItem : I<Day> { // 接口只要求P可读,测试时可以加set方便赋值 public Day P { get; set; } }
- 做这道题的时候你不用关心接口的具体实现细节,只要记住:遍历数组里的每个元素时,直接读元素的
.P属性,就能拿到对应的枚举值。
扩展方法的定义骨架
- 扩展方法有几个硬性语法要求:必须定义在静态类中、本身是静态方法、第一个参数前加
this关键字,代表这个方法可以绑定到第一个参数类型的实例上直接调用。 - 题目要求泛型参数T只能是枚举类型,直接给泛型加枚举约束
where T : Enum即可,方法的基础签名参考如下(逻辑自行补全):
public static class Extensions // 自定义的静态类,放扩展方法 { public static Dictionary<T, List<I<T>>> Indexing<T>(this I<T>[] s) where T : Enum { // 在这里实现分组逻辑 } }
- 注意题目里的关键要求:返回的分组结果是方法调用时刻的快照,后续修改原数组的元素引用不会影响字典里的结果。也就是说你必须在方法执行时立刻遍历完整个数组,按每个元素当时的P值完成分组,不能延迟执行。另外所有枚举值都要作为字典的key存在,没有对应元素的key对应的序列是空数组/空列表。
示例测试方法
- 先按上面的代码准备好Day枚举和TestItem实现类
- 初始化长度为6的
I<Day>[]数组,每个元素是TestItem实例,按题目示例给每个实例的P属性赋值:索引0、1、3的元素P为Mo,索引2、5的为We,索引4的为Fr - 调用
var res = arr.Indexing();拿到返回的字典 - 执行题目里的修改逻辑:从索引1开始遍历,把arr后续所有元素都替换成arr[0]
- 逐key校验结果:Mo对应的列表应该包含原0、1、3位置的元素,We对应原2、5位置的元素,Fr对应原4位置的元素,Tu和Th对应的列表为空,就说明逻辑正确。
- 小提示:不需要手动硬编码所有枚举值,用
Enum.GetValues(typeof(T)).Cast<T>()就能拿到T类型的全部枚举值,用来初始化字典的所有key。
内容的提问来源于stack exchange,提问作者Ghimbo21
相关产品推荐
相关产品推荐

