You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 21:03:18