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++ ...
随机推荐
- Memcached应用总结
Memcached应用总结 memcached是一款高性能的分布式缓存系统,凭借其简单方便的操作,稳定可靠的性能广泛应用于互联网应用中,网上关于memcached介绍的资料也很多,最经典的资料就是&l ...
- 沙盒操作的核心函数 - NSSearchPathForDirectoriesInDomains用法
1. iPhone会为每一个应用程序生成一个私有目录,这个目录位于: /Users/sundfsun2009/Library/Application Support/iPhone Simulator/ ...
- 在eclipse中运行wordcount,控制台打印log4j警告
log4j:WARN No appenders could be found for logger (org.apache.hadoop.util.Shell).log4j:WARN Please i ...
- The Primo ScholarRank Technology: Bringing the Most Relevant Results to the Top of the List
By Tamar Sadeh, Director of Marketing In today’s world, users’ expectations for a quick and easy sea ...
- Mysql 5.6 Cmake 编译安装
MySQL编译安装 环境: OS: CentOS 6.6x64 mini mysql: mysql-5.6.251. mysql 下载: http://dev.mysql.com/downloads/ ...
- 3.4 C与汇编程序的相互调用
为了提高代码执行效率,内核源代码中有些地方直接使用了汇编语言编制.这就会涉及在两种语言编制的程序之间相互调用的问题. 函数调用包括从一块代码到另一块代码之间的双向数据传递和执行控制转移.数据传递通过函 ...
- php 魔术方法 __autoload()
PHP在魔术函数__autoload()方法出现以前,如果你要在一个程序文件中实例化100个对象,那么你必须用include或者require包含进来100个类文件,或者你把这100个类定义在同一个类 ...
- 郝斌老师C语言学习笔记(一)
在给变量分配内存时,很可能这段内存存在以前其他程序使用留下的值.当使用VC编译器,若编译器发现没有给变量赋值而使用,就会返回一个以“85”开头的很大的数字(此时该段内存中为一个垃圾数,为了避免出现较常 ...
- SQL WHILE 循环中的游标 用例,SQL中实现循环操作
--声明两个应用变量 declare @USERID_ int declare @ORGANISEUNITID_ int --声明一个变量计数用,开发中可以忽略 declare @i int=0 -- ...
- 2017-1-9css
2017-1-9css css border-image详解 http://www.360doc.com/content/14/1016/13/2792772_417403574.shtml 最简单的 ...