自己动手写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移动插件实现
序言 本章作为自己动手写插件的第一篇文章,会尽可能的详细描述一些实现的方式和预备知识的讲解,随着知识点积累的一点点深入,可能到了后期讲解也会有所跳跃.所以,希望知识点不是很扎实的读者或者是初学者,不要 ...
随机推荐
- jquery 点击按钮实现listbox的显示与隐藏,点击其他地方按钮外的地方,隐藏listbox
本来不知道如何获取服务器的控件的,这下知道可以这么做了,所以记录下来.... <asp:ImageButton ID="alltime" ImageUrl="ima ...
- Bootstrap的aria-label与aria-labelledby
aria-label: 正常情况下,form表单的input组件都有对应的label,当input组件获取到焦点时,屏幕阅读器会读出相应label里的文本. 但是如果没有给输入框设置label时,当其 ...
- 从VS转MyEclipse的15天使用体验
脱离了VS强大的IDE功能之后,转向MyEclipse,发现很大差别,Java的IDE对比VS感觉弱很多,而且树形没有那么好用,Java里面是以包为主,区别与C#的最大就是,高亮提示关键字,这一点Ja ...
- T-SQL 基于关系分割字符串
今天晚上学习了下 SQL 基于关系的运算,同时也捉摸着写了个例子,虽然我知道性能不是很好,还有待优化.直接上源代码吧,思路表达出来有点困难,直接贴上代码,如果有人不懂得可以MM 我. declare ...
- jQuery的三种$()
参考脚本之家“http://www.jb51.net/article/21660.htm” $号是jQuery“类”的一个别称,$()构造了一个jQuery对象.所以,“$()”可以叫做jQuer ...
- Scala io操作
1. 读文件 scala特有的是scala.io.Source,例如: import scala.io._ Source.fromFile(“cn.scala”,”utf8”).mkString 逐行 ...
- 基础知识——Cocos2d-x学习历程(三)
1.场景与流程控制 我们把一些内容相对不变的游戏元素集合称作场景(scene),把游戏在场景之间切换的过程叫做流程控制(flow control). 在Cocos2d-x中,场景的实现是Scene. ...
- BZOJ 4199: [Noi2015]品酒大会( 后缀数组 + 并查集 )
求出后缀数组后, 对height排序, 从大到小来处理(r相似必定是0~r-1相似), 并查集维护. 复杂度O(NlogN + Nalpha(N)) ------------------------- ...
- ROS开发文档
http://docs.ros.org/indigo/api/roscpp/html/classros_1_1NodeHandle.html#af0bf7baa0ab2385275bb657cc358 ...
- linux杂记(七)linux档案与目录管理指令
1.目录的相关操作:cd,pwd,mkdir,rmdir 路径(PATH): 绝对路径:路径的写法[一定由根目录/写起],例如/usr/share/doc这个目录 相对路径:路径的写法[不是由/写起] ...