System.Collections深入探讨--如何创建自定义的集合类
正文:
在System.Collections namespace下面,存在两个class ,分别为ArrayList和 List<T> ,都可以实现对象的数组队列。那么两者之间到底有什么区别呢?如何利用其创建自定义的集合类呢?
1. ArrayList
ArrayList对象主要的方法包括:
1:Add()向数组中添加一个元素,
2:Remove()删除数组中的一个元素
3:RemoveAt(int i)删除数组中索引值为i的元素
4:Reverse()反转数组的元素
5:Sort()以从小到大的顺序排列数组的元素
6:Clone()复制一个数组
其主要缺点是:当对非valueType的变量进行Add操作时,compiler会自动进行一个boxing操作。因此,不管任何类型的object,都可以Add至ArrayList中,这样就破坏了类型安全性(type security)
例如:
using System.Collections
public class Program
{
ArrayList al=new ArrayList();
al.Add(1);
al.Add("12");
al.Add(2.3);
}
/*
这样的Add操作往往背后hide相应的boxing operation。 而且可以看出,这些插入的对象相互之间即使没有任何逻辑上的联系,也可以Add, compiler不会报措!
*/
2. List<>
可通过索引访问的对象的强类型列表, LIst是一种泛型Generic。提供用于对列表进行搜索、排序和操作的方法。其作用应该和ArrayList差不多。
但是,List<>是支持强类型的。也就是List<>在进行Add operation的时候,compiler会进行类型的检查。从而在compile阶段,就可以发现不安全的类型。
using System.Collections
public class Program
{
List<int> _list=new List<int>;
al.Add(1);//ok
al.Add("12");//error! did not pass type security check
al.Add(2.3);//error!
}
3. 如何构建自定义集合类型。
当某个对象由另外若干个相同对象组成时,我们就可以定义该对象为集合类型,这样就可以对该对象内的组成对象进行枚举操作(IEnumerable)。
题外话:IEnumerable和IEnumerator什么区别?
答:结构如下:
public interface IEnumerabe
{
IEnumerator GetEnumerator();
}
public interface IEnumerator
{
object Current();
bool MoveNext();
......
}
实际上,ArrayList和List<>都已经实现了IEnumerator的接口,因此一般情况下我们不必要自己实现这些interface。
因此,如果要创建自定义的集合类,我们必须继承自IEnumerator接口,并且实现IEnumerator的GetEnumerate方法。当然,我们不可能亲自去implement IEnumerator如此多的方法,我们都会借助于ArrayList或者List<>的GetEnumerate方法。
示例如下:
学生类
public class Student
{
public Student(string name)
{
_name=name;
}
public void ShowInformation()
{
Console.WriteLine(_name);
}
private string _name;
}
学生集合类
public class StudentCollections:IEnumerable
{
private List<Student> stuColl=new List<Student>;
public void Add(Student stu)
{
stuColl.Add(stu);
}
public IEnumerator GetEnumerator()
{
stuColl.GetEnumerator();
}
}
客户端调用:
public class Program
{
public static void Main()
{
StudentCollections stucoll=new StudentCollections();
stucoll.Add(new Student("herengang"));
stuconl.Add(new Student("hrg"));
foreach(Student stu in stucoll) //集合类的枚举内部对象的操作
stu.Show();
}
}
完成!这样就实现了一个自定义的集合类。以上集合类我们采用了List<>来实现。实际上我们也可以采用ArrayList。当然,Generic是在C# 2.0才推出的 :)
转载于:https://www.cnblogs.com/Winston/archive/2008/05/29/1210143.html
System.Collections深入探讨--如何创建自定义的集合类相关推荐
- 【Unity】创建自定义Playable,使用Timeline控制Particle System的参数
Timeline功能强大,但可控的参数还是较少,官方提供了自定义编写Playable的方法,用于扩展Timeline,使其更加强大. 上一篇我们介绍了一些官方发布到Asset Store上的免费Pla ...
- 使用 .NET Core模板引擎创建自定义的模板和项目
本文要点 .NET CLI 包含了一个模板引擎,它可以直接利用命令行创建新项目和项目项.这就是"dotnet new"命令. 默认模板集涵盖了默认控制台和基于 ASP.NET 的应 ...
- 使用 DotNet CLI 创建自定义的 WPF 项目模板
描述 当我们安装完 DotNetCore 3.0 版本的 SDK 后,我们就可以创建基于 DotNetCore 的 WPF 项目模板,通过如下 CLI 可以方便快捷的创建并运行我们的项目: Copy ...
- Sharepoint SP1下创建自定义字段应注意的问题
Sharepoint SP1创建自定义字段下面有一个Bug,我不知道SP2解决了这个问题没有: 通过调用自定义字段类型父类的SetCustomProperty(string propertyName, ...
- ArcGIS Engine环境下创建自定义的ArcToolbox Geoprocessing工具
在上一篇日志中介绍了自己通过几何的方法合并断开的线要素的ArcGIS插件式的应用程序.但是后来考虑到插件式的程序的配置和使用比较繁琐,也没有比较好的错误处理机制,于是我就把之前的程序封装成一个类似于A ...
- cad自定义菜单cui_AutoCAD.NET二次开发:创建自定义菜单
1.在项目中添加引用:AcCui.dll,这个DLL存放在CAD的安装目录中.但是,好像CAD2007之前的版本里没有这个DLL),我电脑上安装了CAD2004.CAD2005.CAD2008.CAD ...
- cad自定义菜单cui_AutoCAD.NET二次开发:创建自定义菜单(AcCui)
从CAD2007之后,Autodesk提供了一个新的程序集AcCui.dll,使用这个程序集,我们可以方便地做一些界面方面的操作,比如创建自定义菜单. 下面介绍一下菜单的创建过程: 1.在项目中添加引 ...
- Delta3D———通过游戏管理器组件和消息的扩展创建自定义行为 《转》
游戏管理器组件给我们提供了在不修改游戏管理器的情况下灵活扩展我们的自定义行为的能力.游戏管理器组件是基于消息来工作的,定义自定义行为的基本 流程就是创建自定义类型的消息,在合适的时候发送消息,创建自定 ...
- 小D学blend-----如何创建自定义的Tooltip控件
运行环境:blend 4.0或者blend 3.0 +silverlight 3.0(其实我相信步骤应该是差不多的) 语言:C# Tooltip类:它是表示一个长方形的小弹出窗口,该窗口在用户将指针悬 ...
最新文章
- python库_计算机二级教程 Python语言程序设计,第10章python第三方库概览
- python不好的地方_Python 语言中经常有疑惑的地方
- 【赠书】新手速递!深度学习视频理解!
- 设计模式之Future模式——提交任务后立即得到一个Future对象,后面利用该对象得到具体的执行结果。加上回调功能,任务执行结束通知调用者或直接回调相应方法
- 计算机类会议论文2021截稿,科学网—人工智能 | 国际会议截稿信息3条 - 李昕的博文...
- 1.10-SpringMVC直接访问WEB-INF下jsp中的页面
- 第二周CoreiDRAW总结
- 20162317 2017-2018-1 《程序设计与数据结构》第8周学习总结
- mybatis源码阅读(六) ---StatementHandler了解一下
- SPOJ - SUBLEX 【后缀自动机】
- Android开发笔记(七十九)资源与权限校验
- Extjs 例外被抛出且未被接住
- 服务器命令里面怎么删除文件,scp删除服务器文件命令
- 正弦定理、余弦定理及解三角形
- Scala Test
- python计算余弦相似度
- Tableau数据分析笔记-Chapter08数据分层、数据分组、数据集
- gulp : 无法加载文件 C:\Users\Administrator\AppData\Roaming\npm\gulp.ps1
- 紧凑存储的杜利特尔分解法Doolittle(LU分解法)_解线性方程组的直接解法
- 【我是初学者】关于获取配置文件.properties的常见三种方式--只是常见的方式,欢迎牛神来加瓦
热门文章
- 最新Linux之Nacos高可用集群配置
- ASP.NET Web API的Controller是如何被创建的?
- 豆瓣的jQuery使用技巧
- 通过谷歌API验证地址是否存在 How Google’s Geocoding solves Address Validation
- moodle架构分析---表现层的设计(一)
- 集成学习——机器学习面试
- linux work queue
- LeetCode 646. Maximum Length of Pair Chain
- C/C++——一个因为unsigned引发的大问题
- Qt QMYSQL driver not loaded 解决办法