自己动手写List集合(C#)
平时经常使用微软的List集合,觉得理所应当,这阵子突然意识到学编程学这么久,总不能只生存在某个平台某种语言下面。我觉得要跳出这个框,而数据结构是经常用到的,所以呢,作为一个有志向的程序员应该学会它....
所以今天和大家分享一下List是如何编写的,假如你是高手牛人看到我不成熟的水平也别见笑,希望多多点评;如果你水平一般,也可以跟着我来一起做一下。
既然要编写一个List集合就必先确定List的基本操作(注意:为与微软的List区别,下面均以ListSet表示):
1.确定ListSet基本功能(为了效率高效点,ListSet做成了泛型集合)
public class ListSet<T> { public int Count{get;}//集合数据个数 public T this[int index]{ get;set;} //索引 public void Clear();//清空集合 public bool IsEmpty();//判断集合是否为空 public void Add(T item);//添加数据 public void Insert(T item, int index);//插入数据到集合指定位置 public T Remove(int index);//删除集合中指定位置的数据 public int IndexOf(T item);//查找集合中指定数据的位置 public bool Containes(T item);//检查集合中是否包含数据项 }
2.实现每一个方法(由于时间问题(22:47:26--我还要上班),我就不打算详细说明每一个方法的实现步骤,下面给出实现全部源代码,希望对大家的学习有所帮助)
public class ListSet<T> : IEnumerator<T>,IEnumerable { private T[] data; private int capacity; private int count; ; #region 1.构造函数 +ListDS(int capacity) /// <summary> /// 构造函数 /// </summary> /// <param name="capacity">初始化容量</param> public ListSet(int capacity) { this.capacity = capacity; this.data = new T[this.capacity]; } #endregion #region 2.构造函数 ListDS(): this(4) /// <summary> /// 构造函数 /// </summary> public ListSet() : ) { } #endregion #region 3.获得集合个数 +int Count /// <summary> /// 获得集合个数 /// </summary> public int Count { get { return this.count; } } #endregion #region 4.索引器 +T this[int index] /// <summary> /// 索引器 /// </summary> /// <param name="index"></param> /// <returns></returns> public T this[int index] { get { return this.data[index]; } set { this.data[index] = value; } } #endregion #region 5.清空集合 +void Clear() /// <summary> /// 清空集合 /// </summary> public void Clear() { ; ; this.data = new T[this.capacity]; } #endregion #region 6.是否为空 +bool IsEmpty() /// <summary> /// 是否为空 /// </summary> /// <returns></returns> public bool IsEmpty() { ); } #endregion #region 7.添加数据 +void Add(T item) /// <summary> /// 添加数据 /// </summary> /// <param name="item"></param> public void Add(T item) { if (count == capacity) { ; T[] dataNew = new T[this.capacity]; ; while (i < this.data.Length) { dataNew[i] = this.data[i]; i++; } this.data = dataNew; } this.data[count++] = item; } #endregion #region 8.插入数据到指定位置 +void Insert(T item, int index) /// <summary> /// 插入数据到指定位置 /// </summary> /// <param name="item">数据</param> /// <param name="index">位置</param> public void Insert(T item, int index) { || index >= this.Count) { throw new ArgumentOutOfRangeException("索引出界"); } if (this.count == this.capacity) { ; } int i = this.Count; while (i > index) { ]; i--; } this.data[index] = item; this.count++; } #endregion #region 9.移除数据 +T Remove(int index) /// <summary> /// 移除数据 /// </summary> /// <param name="index"></param> /// <returns></returns> public T Remove(int index) { int i = index; || index >= this.Count) { throw new IndexOutOfRangeException(); } T obj = this.data[index]; while (i < this.Count) { ]; i++; } this.count--; return obj; } #endregion #region 10.查找索引位置 +int IndexOf(T item) /// <summary> /// 查找索引位置 /// </summary> /// <param name="item">数据</param> /// <returns>返回相应索引,数据不存在返回-1</returns> public int IndexOf(T item) { ; while (i < this.Count) { if (this.data[i].Equals(item)) { return i; } i++; } ; } #endregion #region 11.是否包含指定数据 +bool Containes(T item) /// <summary> /// 是否包含指定数据 /// </summary> /// <param name="item">数据</param> /// <returns>返回bool值</returns> public bool Containes(T item) { ); } #endregion #region IEnumerator<T> 成员 public T Current { get { return this.data[index]; } } #endregion #region IDisposable 成员 public void Dispose() { } #endregion #region IEnumerator 成员 object IEnumerator.Current { get { return this.data[index]; } } public bool MoveNext() { ))==-)); } public void Reset() { index = -; } #endregion #region IEnumerable 成员 public IEnumerator GetEnumerator() { return (IEnumerator)this; } #endregion }
以上代码为ListSet<T> 泛型集合全部源代码,代码我已经基本测试通过,一般应该不会有大问题。如果有任何问题欢迎评论,谢谢....
自己动手写List集合(C#)的更多相关文章
- 自己动手写spring容器(3)
好久没有写博客了,今天闲下来将之前未完成的表达出来. 在之前的文章自己动手写spring容器(2)中完成了对spring的依赖注入的实现,这篇将会介绍spring基于注解的依赖注入的实现. 在一般的J ...
- Spark大数据处理 之 动手写WordCount
Spark是主流的大数据处理框架,具体有啥能耐,相信不需要多说.我们开门见山,直接动手写大数据界的HelloWorld:WordCount. 先上完整代码,看看咋样能入门. import org.ap ...
- 自己动手写ls命令——Java版
自己动手写ls命令--Java版 介绍 在前面的文章Linux命令系列之ls--原来最简单的ls这么复杂当中,我们仔细的介绍了关于ls命令的使用和输出结果,在本篇文章当中我们用Java代码自己实现ls ...
- 【原创】自己动手写控件----XSmartNote控件
一.前面的话 在上一篇博文自己动手写工具----XSmartNote [Beta 3.0]中,用到了若干个自定义控件,其中包含用于显示Note内容的简单的Label扩展控件,用于展示标签内容的labe ...
- 【原创】自己动手写工具----XSmartNote [Beta 3.0]
一.前面的话 在动笔之前,一直很纠结到底要不要继续完成这个工具,因为上次给它码代码还是一年多之前的事情,参考自己动手写工具----XSmartNote [Beta 2.0],这篇博文里,很多园友提出了 ...
- 【原创】自己动手写工具----XSmartNote [Beta 2.0]
一.前面的话 在上一篇自己动手写工具----XSmartNote中,我简单介绍了这个小玩意儿的大致界面和要实现的功能,看了一下园子里的评论,评价褒贬不一,有人说“现在那么多云笔记的工具”,“极简版ev ...
- 【原创】自己动手写工具----签到器[Beta 2.0]
一.前面的话 上一篇中基本实现了简单的签到任务,但是不够灵活.在上一篇自己动手写工具----签到器的结尾中,我设想了几个新增功能来提高工具的灵活程度,下面把新增功能点列出来看看: (1)新增其他的进程 ...
- 自己动手写ORM的感受
之前看到奋斗前辈和时不我待前辈的自己动手写ORM系列博客,感觉讲解的通俗易懂,清晰透彻.作为一个菜鸟,闲来也想着自己写一个ORM,一来加深自己对 ORM的理解,以求对EF,NHibernate等ROM ...
- 自己动手写插件底层篇—基于jquery移动插件实现
序言 本章作为自己动手写插件的第一篇文章,会尽可能的详细描述一些实现的方式和预备知识的讲解,随着知识点积累的一点点深入,可能到了后期讲解也会有所跳跃.所以,希望知识点不是很扎实的读者或者是初学者,不要 ...
随机推荐
- swipe.js文档及用法
最近的一个项目中使用到了swipe.js这个插件 感觉非常的好用的 官方网站 http://swipejs.com/ https://github.com/bradbirdsall/Swipe 简介 ...
- 2048小游戏(C语言版)
#include <climits> #include <cstdio> #include <cstring> #include <stack> #in ...
- PowerBuilder预防数据库死锁相关处理
实际业务中碰到了PB开发的业务系统造成的数据死锁情况,整理了一些PB关于数据库死锁的一些处理. PB死锁相关 1. 即时的commit和rollback 不同数据库的锁机制各不相同,但对应用程序来说, ...
- Csharp多态的实现概述
(1)什么是多态, 多态就是一个类表现出多种不同的形态, 他的核心是子类对象作为父类对象使用 (2)怎么实现多态, 在Csharp中,可以用接口, 虚方法, 抽象类实现多态,当然,不管是这三种的那一个 ...
- virtualBox文件共享
具体过程,可以参考: http://jingyan.baidu.com/article/2fb0ba40541a5900f2ec5f07.html 共享命令:sudo mount -t vboxsf ...
- Mybatis使用存储过程(MySql)
推荐文章:http://www.iteye.com/topic/1132302 http://yhjhappy234.blog.163.com/blog/static/3163283220124557 ...
- Maven手动创建多模块项目
Maven手动创建多模块项目 我要创建的项目名称是:unicorn,项目包含两个模块,分别是unicorn-core和unicorn-web.包的路径是com.goldpalm.tour. 项目创建流 ...
- Ubuntu12.04获取root权限
有的时候我们需要Ubuntu的root权限,我们该如何获取呢? 其实,很简单,我们只需要在终端中输入以下命令即可获得root权限. 第一步,打开终端 ( ctrl+alt+T ) 第二步,输入命令:s ...
- Oracle 游标Cursor 的基本用法
查询 SELECT语句用于从数据库中查询数据,当在PL/SQL中使用SELECT语句时,要与INTO子句一起使用,查询的 返回值被赋予INTO子句中的变量,变量的声明是在DELCARE中.SELECT ...
- PCB流程-外型加工