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++ ...
随机推荐
- congos 日期控件的简单使用
congos 添加html的标签,然后写上js的代码,这段代码的功能是得到前一天的日期. <input type="button" value="查询" ...
- expr的简单应用
expr命令 是一个手工命令行计数器,用于在UNIX/LINUX下求表达式变量的值,一般用于整数值,也可用于字符串. –格式为: expr expression_r(命令读入Expression 参数 ...
- thrift之TTransport类体系原理及源码详细解析1-类结构和抽象基类
本章主要介绍Thrift的传输层功能的实现,传输的方式多种多样,可以采用压缩.分帧等,而这些功能的实现都是相互独立,和上一章介绍的协议类实现方式比较雷同,还是先看看这部分的类关系图,如下: 由上面的类 ...
- nginx实现负载均衡
A服务器IP :192.168.5.149 (主) B服务器IP :192.168.5.27 C服务器IP :192.168.5.126 A服务器配置: 打开nginx.conf,文件位置在nginx ...
- jquery mobile 复选框和单选框
checkbox 和radio <!DOCTYPE html> <html> <head> <meta charset="utf-8"&g ...
- ASP.NET常用技术之加密解密
在开发项目中有许多数据需要我们进行加密解密操作,这里介绍几个加密解密的方法. 一:MD5加密 MD5加密是一种单向的加密算法,它只能加密,加密后不能进行逆向解密操作,常用于数字签名和加密用户密码. 下 ...
- C#操作Excel开发报表系列整理(转)
C#操作Excel进行报表开发系列共写了七篇,也已经有很久没有新东西了,现在整理一下,方便以后查阅,如果有写新的,会同时更新.需要注意的是因为Office的版本不同,实际的代码可能会有所不同,但是都是 ...
- phpcms v9开源开发框架基础mvc解读
根据对mvc的了解 简要写个mvc框架 也谈不上框架 希望对新手有帮助 简单的解析下mvc 你可以这样了解 m模型也就是数据库操作 v视图 c控制器 通过url来判断调用m和v来完成请求,本身没数 ...
- asp.net 解决IE11下 From身份验证失效问题
指定如何将 Cookie 用于 Web 应用程序. <forms cookieless="UseCookies" name="test" loginUrl ...
- pip安装第三方库以及版本
这篇blog只是写给自己看看的. 今天突然遇到sqlalchemy映射到数据库时,一个字段类型是datetime(6),我这边死活访问不上,之前一直没有问题,最后查明原因,原来是第三方库的版本问题,真 ...