知识大全 构建可反转排序的泛型字典类(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

相关参考

知识大全 Java编程思想里的泛型实现一个堆栈类 分享

Java编程思想里的泛型实现一个堆栈类分享  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  觉得作

知识大全 JDK 5.0中的泛型类型学习

JDK5.0中的泛型类型学习  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  JDK中增加的泛型类

知识大全 Java的泛型原来这样让人不舒服

Java的泛型原来这样让人不舒服  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java泛型中的

知识大全 C#使用相应的泛型版本替换Stack和Queue

C#使用相应的泛型版本替换Stack和Queue  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 java泛型编程

  JDK令我们期待很久可是当他发布的时候却更换版本号为这说明Java已经有大幅度的变化本文将讲解JDK支持的新功能Java的泛型  Java泛型  其实Java的泛型就是创建一个用类型作为参数的类就

知识大全 使用泛型实现单例提供者

介绍  很多有着不同开发背景得人都会比较熟悉单例模式他们会发现每次他们要创建一个不同的单例类的时候都不得不写同样得代码使用新的C#的泛型可以实现只写一次同样得代码背景  已经有很多文章介绍过单例模式也

知识大全 js函数排序的实例代码

这篇文章介绍了js函数排序的代码有需要的朋友可以参考一下 复制代码代码如下:varas=[];assort();//这个排序是按照字典排序//自定义按照数字排序functionsortByN

知识大全 构建器的调用顺序

  构建器调用的顺序已在第章进行了简要说明但那是在继承和多形性问题引入之前说的话    用于基础类的构建器肯定在一个衍生类的构建器中调用而且逐渐向上链接使每个基础类使用的构建器都能得到调用之所以要这样

知识大全 运用设计模式构建通用数据库访问类

这就需要我们在实际开发过程中将这些数据库访问类再作一次封装经过这样的封装不仅可以达到上述的目标还可以减少操作数据库的步骤减少代码编写量在这个方面微软为我们提供了ApplicationBlock但是可惜

知识大全 c#中构建异常处理

  异常是程序运行中发生的错误异常处理是程序设计的一部分在c#中异常处理是通过Exception基类进行的可以创建自己的异常类但这个类必须是继承自Exception基类  异常将导致不完善或者不需要的