C#自定义List类
代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace MyArrayList
{
public class MyArrayList
{
//容量
private const int _defaultCapacity = 4;
//存放数组元素
private object[] _items;
//数组大小
private int _size;
//元素个数为0的数组状态
private static readonly object[] emptyArray = new object[0]; /// <summary>
/// 析构函数(为了不引发未将对象引用到实例,所以对_items赋值)
/// </summary>
public MyArrayList()
{
this._items = emptyArray;
} public MyArrayList(int capacity)
{
if(capacity<0)
throw new ArgumentOutOfRangeException("capacity","ArrayList的容量不可为负数");
this._items = new object[capacity];
} /// <summary>
/// 索引器
/// </summary>
/// <param name="index"></param>
/// <returns></returns>
public virtual object this[int index]
{
get
{
if (index < 0 || index >= this._size)
throw new ArgumentOutOfRangeException("index", "索引超出范围");
return this._items[index];
}
set
{
if (index < 0 || index >= this._size)
throw new ArgumentOutOfRangeException("index","索引超出范围");
this._items[index] = value;
}
} /// <summary>
/// 获取当前数组元素个数
/// </summary>
public virtual int Count
{
get { return this._size; }
} /// <summary>
/// 数组的容量
/// </summary>
public virtual int Capacity
{
get { return this._items.Length; }
set
{
if (value != this._items.Length)
{
if (value < this._size)
{
throw new ArgumentOutOfRangeException("value", "容量太小");
}
if (value > 0)
{
//开辟新内存控件存储元素
object[] dest = new object[value];
if (this._size > 0)
{
//搬动元素
Array.Copy(this._items, 0, dest, 0, this._size);
}
this._items = dest;
}
else //数组最小的空间为4
{
this._items = new object[_defaultCapacity];
}
}
}
} /// <summary>
/// 添加元素
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public virtual int Add(object value)
{
//当空间已满
if (this._size == this._items.Length)
this.EnsureCapacity(this._size + 1);
this._items[this._size] = value;
return this._size++;
} /// <summary>
/// 对数组进行扩容
/// </summary>
/// <param name="p"></param>
public void EnsureCapacity(int p)
{
if (this._items.Length<p)
{
//空间加倍
int num = (this._items.Length == 0) ? _defaultCapacity : (this._items.Length * 2);
if (num <p)
num = p;
this.Capacity = num;
}
} /// <summary>
/// 向指定元素插入元素
/// </summary>
public virtual void Insert(int index,object value)
{
if (index<0 || index>this._size)
throw new ArgumentOutOfRangeException("index","索引超出范围");
if (this._size == this._items.Length)
this.EnsureCapacity(this._size + 1);
if (index < this._size)
Array.Copy(this._items, index, this._items, index + 1, this._size - index); this._items[index] = value;
this._size++;
} /// <summary>
/// 移除指定索引的元素
/// </summary>
/// <param name="index">索引</param>
public virtual void Remove(int index)
{
if (index<0 || index>this._size)
throw new ArgumentOutOfRangeException("index","索引超出范围");
this._size--;
if (index < this._size)
Array.Copy(this._items, index + 1, this._items, index, this._size - index);
this._items[this._size] = null;
} /// <summary>
/// 裁剪空间
/// </summary>
public virtual void TrimToSize()
{
this.Capacity = this._size;
}
}
}
C#自定义List类的更多相关文章
- java自定义注解类
一.前言 今天阅读帆哥代码的时候,看到了之前没有见过的新东西, 比如java自定义注解类,如何获取注解,如何反射内部类,this$0是什么意思? 于是乎,学习并整理了一下. 二.代码示例 import ...
- 关于MapReduce中自定义分区类(四)
MapTask类 在MapTask类中找到run函数 if(useNewApi){ runNewMapper(job, splitMetaInfo, umbilical, reporter ...
- 关于MapReduce中自定义分组类(三)
Job类 /** * Define the comparator that controls which keys are grouped together * for a single ...
- kettle系列-[KettleUtil]kettle插件,类似kettle的自定义java类控件
该kettle插件功能类似kettle现有的定义java类插件,自定java类插件主要是支持在kettle中直接编写java代码实现自定特殊功能,而本控件主要是将自定义代码转移到jar包,就是说自定义 ...
- java 28 - 4 JDK5的新特性 之 枚举的概述和自定义枚举类
枚举 枚举概述 是指将变量的值一一列出来,变量的值只限于列举出来的值的范围内.举例:一周只有7天,一年只有12个月等. 回想单例设计模式:单例类是一个类只有一个实例 那么多例类就是一个类有多个实例,但 ...
- 客户端使用自定义代理类访问WCF服务 z
通常在客户端访问WCF服务时,都需要添加服务引用,然后在客户端app.config或 web.config文件中产生WCF服务的客户端配置信息.若是每添加一个服务都是这样做,这样势必会将比较麻烦,能否 ...
- Lua调用自定义C++类
弄了一天终于会Lua调用自定义C++类.不容易啊. 我的电脑是64位的,装了64的Python不行,装了32位的就可以了,靠!下面是报错信息 python pyyaml Cheetah全都是装32位的 ...
- [转]掌握 ASP.NET 之路:自定义实体类简介 --自定义实体类和DataSet的比较
转自: http://www.microsoft.com/china/msdn/library/webservices/asp.net/CustEntCls.mspx?mfr=true 发布日期 : ...
- cocos2dx-lua绑定自定义c++类(二)
在 cocos2dx-lua绑定自定义c++类(一)中介绍了如何产生绑定文件. 现在,来看看怎么在工程里使用这个cpp文件.像普通源码文件一样,导入到工程里,看到 LuaTest.h文件里有一个函数入 ...
- cocos2dx-lua绑定自定义c++类(一)
本文主要介绍mac上,如何将自定义的c++类,绑定到lua. 1.工具先行 找到 你的cocos2d-x/tools/tolua++,里面文件按类型大致分为: (1)*.pkg:用于定义要绑定的c++ ...
随机推荐
- C# - openxml 操作excel - '“System.IO.Packaging.Package”在未被引用的程序集中定义'
在 CodeProject中,有位网友写的一篇基于OpenXML SDK 2.0对excel(大数据量)进行操作,其中,运行的时候,有如下错误: 类型“System.IO.Packaging.Pack ...
- DELL磁盘阵列控制卡(RAID卡)MegaCli常用管理命令汇总
新版本的 MegaCli-1.01.24-0.i386.rpm (下载地址:http://www.lsi.com/downloads/Public/MegaRAID Common Files/8.02 ...
- JavaScript 显示弹出窗口
window . showModalDialog ( sURL,vArguments , sFeatures )参数说明: sURL--必选参数,用来指定对话框要显示的文档的URL. //要显示页面的 ...
- 武汉科技大学ACM :1005: 一二三
Problem Description 你弟弟刚刚学会写英语的一(one).二(two)和三(three).他在纸上写了好些一二三,可惜有些字母写错了.已知每个单词最多有一个字母写错了(单词长度肯定不 ...
- java第一天的疑问
1字节 的 byte 2字节 的 char 精度 byte<short<char<int<long<float<double 随便打个整数默认为int 随便打个小数 ...
- c 中可变参数的实现
我们在C语言编程中有时会遇到一些参数个数可变的函数,例如printf()函数,其函数原型为: 例一: int printf( const char* format, ... ...
- QT学习:入门篇(三)
头文件: #ifndef CChatDisplaySet_h #define CChatDisplaySet_h #include "QtGui/QDialog" #include ...
- oracle中char,vchar,vchar2的区别与联系
1.char是固定长度的,例如你定义某一列类型为char(20).那么即便你插入"abcde"5个字节,数据库也会在后面自动加上15个字节(可能为空格),以补足二十个字节. 2.v ...
- Mysql 5.7.9 cmake boost.cmake 处理
环境Centos 6.7 x64 mininal 今天突然编译Mysql 5.7.9 按之前的cmake .的方式 发现报错了..提示 需要boost -- BOOST_INCLUDE_DIR /us ...
- 1.3.1 switch 语句中的 String
switch语句是一种高效的多路语句,可以省掉很多繁杂的嵌套if判断: 在Java 6及之前,case语句中的常量只能是byte.char.short和int(也可以是对应的封装类)或枚举常量,在Ja ...