平时经常使用微软的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#)的更多相关文章

  1. 自己动手写spring容器(3)

    好久没有写博客了,今天闲下来将之前未完成的表达出来. 在之前的文章自己动手写spring容器(2)中完成了对spring的依赖注入的实现,这篇将会介绍spring基于注解的依赖注入的实现. 在一般的J ...

  2. Spark大数据处理 之 动手写WordCount

    Spark是主流的大数据处理框架,具体有啥能耐,相信不需要多说.我们开门见山,直接动手写大数据界的HelloWorld:WordCount. 先上完整代码,看看咋样能入门. import org.ap ...

  3. 自己动手写ls命令——Java版

    自己动手写ls命令--Java版 介绍 在前面的文章Linux命令系列之ls--原来最简单的ls这么复杂当中,我们仔细的介绍了关于ls命令的使用和输出结果,在本篇文章当中我们用Java代码自己实现ls ...

  4. 【原创】自己动手写控件----XSmartNote控件

    一.前面的话 在上一篇博文自己动手写工具----XSmartNote [Beta 3.0]中,用到了若干个自定义控件,其中包含用于显示Note内容的简单的Label扩展控件,用于展示标签内容的labe ...

  5. 【原创】自己动手写工具----XSmartNote [Beta 3.0]

    一.前面的话 在动笔之前,一直很纠结到底要不要继续完成这个工具,因为上次给它码代码还是一年多之前的事情,参考自己动手写工具----XSmartNote [Beta 2.0],这篇博文里,很多园友提出了 ...

  6. 【原创】自己动手写工具----XSmartNote [Beta 2.0]

    一.前面的话 在上一篇自己动手写工具----XSmartNote中,我简单介绍了这个小玩意儿的大致界面和要实现的功能,看了一下园子里的评论,评价褒贬不一,有人说“现在那么多云笔记的工具”,“极简版ev ...

  7. 【原创】自己动手写工具----签到器[Beta 2.0]

    一.前面的话 上一篇中基本实现了简单的签到任务,但是不够灵活.在上一篇自己动手写工具----签到器的结尾中,我设想了几个新增功能来提高工具的灵活程度,下面把新增功能点列出来看看: (1)新增其他的进程 ...

  8. 自己动手写ORM的感受

    之前看到奋斗前辈和时不我待前辈的自己动手写ORM系列博客,感觉讲解的通俗易懂,清晰透彻.作为一个菜鸟,闲来也想着自己写一个ORM,一来加深自己对 ORM的理解,以求对EF,NHibernate等ROM ...

  9. 自己动手写插件底层篇—基于jquery移动插件实现

    序言 本章作为自己动手写插件的第一篇文章,会尽可能的详细描述一些实现的方式和预备知识的讲解,随着知识点积累的一点点深入,可能到了后期讲解也会有所跳跃.所以,希望知识点不是很扎实的读者或者是初学者,不要 ...

随机推荐

  1. Ajax或JS动态添加的元素,Jquery效果不起作用

    问题: 最近在做一个Ajax分页的功能,遇到一个问题 一开始jquery效果是可用的,但是,ajax执行一次之后,jquery效果就无效了. 解决办法: 可以添加live事件来解决 W3C关于live ...

  2. DataSet和DataTable详解

    先构建一个结构与用户请求数据结构相同的DataTable,然后将用户的请求数据填充到构建好的DataTable中,最后将DataTable添加到DataSet中. DataTable,,DataCol ...

  3. android操作ini工具类

    package com.smarteye.common; import java.io.BufferedReader; import java.io.BufferedWriter; import ja ...

  4. mysql查询结果写入文件

    注:转自csdn zuyi532 方法1: shell> mysql -uroot -proot -h localhost xxx库 -e " select * from xxx表 l ...

  5. Aliyun EMR 集群重启

    1.如果Core节点有Down掉,ActiveNodes少于Core节点数. 处理: a.登陆到Master节点,到目录 /opt/apps/hadoop-2.7.2/sbin b.执行 ./stop ...

  6. [ 转 ]jquery的ajax和getJson跨域获取json数据

    目前浏览器端跨域访问常用的两种方法有两种: 1.通过jQuery的ajax进行跨域,这其实是采用的jsonp的方式来实现的. jsonp是英文json with padding的缩写.它允许在服务器端 ...

  7. Android 内部存储安装apk文件实现

    目前国内市场的山寨机横行,安卓手机升级也是一天一个样,对于原来老手机可能没有SDCARD,导致我们的APP不能下载资源,无法更新APP,针对这种情况有以下解决方案.通过以下函数判断是否有SD卡再判断下 ...

  8. codeforces 546D Soldier and Number Game

    题目链接 这个题, 告诉你a, b的值, 那么只需要求出b到a之间的数, 每个数有多少个因子就可以. 具体看代码, 代码里面有解释 #include<bits/stdc++.h> usin ...

  9. SVN权限配置

    初始化SVN仓库后,里面有以下文件. 其中conf是对授权.认证进行管理的,conf目录里的内容有: passwd设立账户密码: authz权限管理: 假设pwd里有user1,user2两个账户 @ ...

  10. 激活工具 – Microsoft Toolkit 2.4.7

    Microsoft Toolkit是一款很出名的Windows/Office激活工具,最早是因为激活Office 2010出名的,想必不少人也用过吧?Microsoft Toolkit从2.4.1版本 ...