通过委托传递索引规则
如上文,对于检索规则固定的情况而言,我们可以通过在索引器内部硬编码完成,但如果要完成一些更为公共的类库,我们往往还需要“授之以渔”,即除了告诉他“要检索”这个任务之外,还要把检索策略和规则告诉它。这方面C#是非常有优势的,因为它有对象化的托管委托类型(delegate),而且.NET Framework FCL部分也提供了很多现成的委托,所以我们不妨善加利用。
这时候,我们会发现索引器的功能更加强大,我们就像在使用SQL语句的WHERE 子句一样,以灵活的方式对目标数据根据需要筛选。

附件:
您所在的用户组无法下载或查看附件
附件:
您所在的用户组无法下载或查看附件不过,我们在实际使用中WHERE子句可能还会包括不只一条的限制条件,索引器一样可以完成。例如,定义为下列形式:

附件:
您所在的用户组无法下载或查看附件LINQ时代的索引器乍一看,索引器似乎已经越来越接近于LINQ通过Lamada表达式完成的功能,不过有些区别:
- 定位上索引器一般面向单条检索结果,而不是批量结果(尽管我们可以让索引器返回一个IEnumerable)
- 从封装和客户程序使用的角度看,LINQ有各种内置并被优化的LINQ to系列,而索引器给客户程序是一种更为贴近业务语义、更加直观的形式,因为客户程序无需写LINQ查询,只是按照键值检索即可
不过,把两者结合使用倒是一个非常不错的组合,索引器做接口、LINQ完成内部检索逻辑,客户程序在无需记住具体方法名称的前提下,按照键值检索即可,索引器内部则依托LINQ to系列的基础,提供对各种异构数据源的访问。
小结就像我们设计接口时会根据业务领域,把类型的职能分解一样,操作类型的时候同样,一样可以根据访问内容不同,选择使用不同的访问方法,比如:
- 索引器:承担各种检索和查找的工作
- 属性(Property):承担“它的…特性是…”或“它们的…特质是…”的工作,用来标注某个实例特性(成员属性)或静态特性(静态属性)
- 普通的方法:承担“让它处理……”的职能
- 而事件定位于“当……发生的时候,需要作些……”
受到惯性影响,我们常常把索引器作为一个仅仅按照编号反馈结果的入口,但就如SQL 中的WHERE子句, 我们其实可以做很多。善用之,它会令我们的程序更加亲切、更加清晰。