用C#自定义一个简单的集合
闲来无聊来自己做了一个简单的'集合',用来加深自己对集合的理解
class listNode
{
private object value;
public listNode(object _value)
{
this.value = _value;
}
public object Value
{
get { return value; }
}
public listNode Next { get; set; }
public listNode Prev { get; set; }
}
//定义一个MyList集合
class MyList :IEnumerable
{
//用first和last标记链表的头和尾
private listNode first;
public listNode First
{
get { return first; }
}
private listNode last;
public listNode Last
{
get { return last; }
}
//为集合添加元素的方法
public listNode Add(object node)
{
listNode newNode = new listNode(node);
if (first == null)
{
first = newNode;
last = first;
}
else
{
last.Next = newNode;
last = last.Next;
}
return newNode;
}
//实现迭代功能
public IEnumerator GetEnumerator()
{
listNode current = first;
while (current != null)
{
yield return current.Value;
current = current.Next;
}
}
}
终于代码,写好了,来实例化看一下效果
class Program
{
static void Main(string[] args)
{
MyList list = new MyList();
list.Add(1);
list.Add(5);
list.Add(6);
list.Add(10);
foreach (var item in list)
{
Console.WriteLine(item);
}
Console.ReadKey();
}
}
查看运行效果,大功告成
这不就是一个简单的集合吗?事实是这样的吗,其实这个MyList算不上是一个集合,只能算是一个链表,因为它与一个“合格”的集合比,还差的太多。上面代码只简单实现了一个简单的Add方法,一个完整的集合是应该可以有增删改查等许多复杂功能的啊。但是你也可以就把它当做一个集合(一个不完整的集合),甚至可以说,不光上面写的MyList是一个集合,如果只要一个类只要实现类了迭代器的功能(上面的Imnumerable接口),那么这个类就是一个集合,因此它也就可以用foreach来遍历。我们不能因为它不能因为这个集合的等功能不完整就说它不是集合吧。就好比一个人不能走路,不能说话,那他任然是一个人,总不能说他不是人吧。
C#集合:
1.迭代与集合的关系:一个类只要实现了迭代功能,就可以说它是一个集合;
2.集合与foreach的关系:如果一个类型(也可以说一个集合)能用foreach遍历,那么该类型一定实现了Imnumerable接口,反之;
真正理解了的话,你会发现上面的两点其实是一句话,至于什么是Imnumerable接口,也就是所谓的迭代器,之后有机会我也会相关的做出总结文档,最后我们在上面的MyList多加一条数据list.Add("ddaad");你会发现并不会报错,那是因为我在遍历时给item用的var类型,那如果我把var改成int类型,程序就会报错了,所以我们的这个集合和C#里的ArrayList一样,在类型安全上有很大的问题,那怎么解决这个问题呢,答案就是用泛型
用C#自定义一个简单的集合的更多相关文章
- 自定义一个简单的JDBC连接池
一.什么是JDBC连接池? 在传统的JDBC连接中,每次获得一个Connection连接都需要加载通过一些繁杂的代码去获取,例如以下代码: public static Connection getCo ...
- 自定义一个简单的SegmentedControl
先大概看下我们想实现简单的效果 源码 // // DSegmentedControl.swift // IOS学习之自定义UISegmentedControl // // Created by din ...
- Struts—自定义一个简单的mystruct
传统mvc开发总结: 1. 跳转代码写死,不灵活 2. 每次都去写servlet,web.xml中配置servlet! (配置目的: 请求, Servlet处理类) 一个简单的struct案例,描述如 ...
- 代码调试--自定义一个简单的debug函数
function debug(){ $num_args = func_num_args(); //实参个数 $arg_list = func_get_args(); //返回某一个实参,必须是实参数组 ...
- 自定义一个简单的web框架
from wsgiref.simple_server import make_server def book(request): #视图函数 return [b'<h1> book ...
- [安卓] 18、一个简单的例子做自定义动画按钮和自定义Actionbar
在做安卓UI的时候有时候需自定义具有动画效果的按钮或需要自定义一下actionbar~ 本节用一个简单的demo讲如何自定义具有动画效果的按钮,以及个性化的actionbar 下面是效果: 其中: △ ...
- 自定义View(三)--实现一个简单地流式布局
Android中的流式布局也就是常说的瀑布流很是常见,不仅在很多项目中都能见到,而且面试中也有很多面试官问道,那么什么是流式布局呢?简单来说就是如果当前行的剩余宽度不足以摆放下一个控件的时候,则自动将 ...
- 并发编程概述 委托(delegate) 事件(event) .net core 2.0 event bus 一个简单的基于内存事件总线实现 .net core 基于NPOI 的excel导出类,支持自定义导出哪些字段 基于Ace Admin 的菜单栏实现 第五节:SignalR大杂烩(与MVC融合、全局的几个配置、跨域的应用、C/S程序充当Client和Server)
并发编程概述 前言 说实话,在我软件开发的头两年几乎不考虑并发编程,请求与响应把业务逻辑尽快完成一个星期的任务能两天完成绝不拖三天(剩下时间各种浪),根本不会考虑性能问题(能接受范围内).但随着工 ...
- ios开发UI篇—使用纯代码自定义UItableviewcell实现一个简单的微博界面布局
本文转自 :http://www.cnblogs.com/wendingding/p/3761730.html ios开发UI篇—使用纯代码自定义UItableviewcell实现一个简单的微博界面布 ...
随机推荐
- Python -- 图片处理
使用PIL库 转换图片格式(jpg --> png) from PIL import Image Image.open('E:/art.jpg').save('E:/art.png')
- R语言中常用包(二)
数据导入 以下R包主要用于数据导入和保存数据 feather:一种快速,轻量级的文件格式.在R和python上都可使用readr:实现表格数据的快速导入.中文介绍可参考这里readxl:读取Micro ...
- Go 协程编程感悟
0.GPM模型 1.默认地, Go所有的goroutines只能在一个线程里跑 ,除非告诉Go我们允许同时最多使用多个核,或者主动让出CPU时间,使goroutine可以抢占式的执行 2.如果当前go ...
- 01-python基础
前几天, 觉得python简单的不行, 没有仔细做笔记, 然后今天翻了下前几天看的东西, 还是记下来吧 对于python2.7 和 python3 , 建议使用python3 的模式编程, 然后使用p ...
- 理解Linux内核之中断控制
乍一看下边的Linux内核代码,貌似L3389有bug,于是我就绕有兴趣地阅读了一下local_irq_save/local_irq_restore的源代码. /* linux-4.14.12/mm/ ...
- Vue前端框架面试问题
1.active-class是哪个组件的属性?嵌套路由怎么定义? 答:vue-router模块的router-link组件. 2.怎么定义vue-router的动态路由?怎么获取传过来的动态参数? 答 ...
- java.lang.NoSuchMethodError: org.json.JSONArray.iterator()Ljava/util/Iterator 阿里云短信
请尝试使用 <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk ...
- 【设计模式】观察者模式 Observer Pattern
定义:观察者模式定义了对象之间的一对多依赖.当“主题”(Object)状态改变事,所有依赖它的“观察者”(Observer)都会受到通知并自动更新.主题支持观察者订阅和退订. 观察者模式提供了一种对象 ...
- 快排,归并和Shell排序
快速排序 快速排序的执行流程: (1) 先从数列中取出一个数作为基准数. (2) 将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边. (3)再对左右区间重复第二步,直到各区间只有一个数. ...
- c#调用webservices
有两种方式,静态调用(添加web服务的暂且这样定义)和动态调用: 静态调用: 使用添加web服务的方式支持各种参数,由于vs2010会自动转换,会生成一个特定的Reference.cs类文件 动态 ...