知识大全 构建可反转排序的泛型字典类(1)--雏形

Posted

篇首语:学者有自立之志,当拔出流俗,不可泛泛与世浮沉。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 构建可反转排序的泛型字典类(1)--雏形相关的知识,希望对你有一定的参考价值。

  前言

  前段时间为了查找泛型资料 我翻译了O Reilly 出版的《C# Cookbook》这本书的几个关于泛型的章节 其中 反转Sorted List里的内容 (见 )这一节中有一个接近 行代码的例子 当时看到这个例子吓了一跳 这是一个足以让人头晕眼花的数字 粗略看了一下 感觉代码质量非常高 非常值得我们去学习 于是决定写一系列文章分析它 象搭积木一样逐步把这个ReversibleSortedList构建完成

  在读这一篇文章之前 您需要明白一件事 如果只在一个项目里用到这个类 有必要花费 行代码去构建它吗?我个人的观点是没有必要 FCL(Framework Class Library)中有很多现成的东西 拿过来用就行了 那还有什么理由去研究它呢?我提供以下几点做为参考

  l 想通过阅读高质量的代码来提高自己

  l 对FCL如此着迷 想通过它迈出第一步

  l 您希望自己的代码有机会给其他程序员使用 换句话说 您面向的是程序员 您是一个组件编写者 从某一方面说 您越麻烦 就意味着您的用户越方便

  呵呵 不那么多疲话了 开始工作

  雏形你想构建一个集合类用于存储数据 它里面的值是成对出现的 每一对值都包含 键 和 值 两个部分 键和值里存放的数据类型是不确定的 最好什么类型放到里面都适用 想起了什么?就是它!泛型!真是太伟大了!

  接下来要考虑的问题是采用什么样的方式来存储这些值 你觉得自己的数据结构学得还比较好 决定要控制一切 在所有集合类型中 数组的速度是最快的 而且它使用方便并且是类型安全的 唯一的缺点就是容量固定 好!不管那么多了 用的就是它 先把代码写出来再说

  public class ReversibleSortedList

  

  private TKey[] keys; //键数组

  private TValue[] values; //值数组

  

  总算迈出了第一步 确定了大的方向 但是数组是容量固定的 如何能让它的容量可以随着元素的增长而自动增长呢?即然要控制容量 那就要有一个容量属性 用于读取和设置容量 先从读取开始 容量值就是数组keys或values的长度 好 继续添加代码

  public class ReversibleSortedList

  

  private TKey[] keys; //键数组

  private TValue[] values; //值数组

  public int Capacity //容量属性

  

  get

  

  return this keys Length;

  

  

  

  现在问题来了 当ReversibleSortedList被实例化后直接读取Capacity属性 将会调用keys Length属性来返回 但此时keys并没有被初始化 肯定不能访问其Length属性 可不可以在声明的同时把它初始化为元素个数为 的数组呢?

  private TKey[] keys = new TKey[ ]; //键数组

  这样做是没有什么问题 但它刚声明就成为了垃圾 什么都放不了 总让人感觉不舒服 那可不可以让数组初始化为一个固定容量呢?

  private TKey[] keys = new TKey[ ]; //键数组

  但你是一个完美主义者 不希望这样就使用了 个位置的空间 你更希望在添加元素时才会有空间的拓展 可不可以声明两个静态的 初始长度为 的数组做为其初始状态呢?这样不管类有多少个实例 进行初始化时使用的都是它们 这样即避免了空间的浪费 也不再需要多次初始化 长度数组

  private static TKey[] emptyKeys; //用于键数组的初始化

  private static TValue[] emptyValues; //用于值数组的初始化

  可以在静态构造器(又称类型构造器)里把它们初始化为长度为 的数组 并在无参实例构造器中把这两个初始值赋给keys和values数组

  为了测试自己的想法 需要添加Main()方法进行测试 下列代码可以直接拷贝并运行 如果不知道如何运行 请参考

  ReversibleSortedList 版本 对ReversibleSortedList类的容量进行初始化

  using System;using System Collections;using System Collections Generic;

  public class ReversibleSortedList#region 成员变量private TKey[] keys; //键数组private TValue[] values; //值数组private static TKey[] emptyKeys; //用于键数组的初始化private static TValue[] emptyValues; //用于值数组的初始化#endregion#region 构造方法//类型构造器static ReversibleSortedList()ReversibleSortedList emptyKeys = new TKey[ ];ReversibleSortedList emptyValues = new TValue[ ];public ReversibleSortedList()this keys = ReversibleSortedList emptyKeys;this values = ReversibleSortedList emptyValues;#endregion#region 公有属性public int Capacity //容量属性getreturn this keys Length;#endregionpublic class Teststatic void Main()ReversibleSortedList rs=new ReversibleSortedList();Console WriteLine(rs Capacity);

  运行结果

cha138/Article/program/net/201311/11379

相关参考