作为一个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来遍历。我们不能因为它不能因为这个集合的等功能不完整就说它不是集合吧。就好比一个人不能走路,不能说话,那他任然是一个人,总不能说他不是人吧。
所以我个人对集合的理解:
1.迭代与集合的关系:一个类只要实现了迭代功能,就可以说它是一个集合;
2.集合与foreach的关系:如果一个类型(也可以说一个集合)能用foreach遍历,那么该类型一定实现了Imnumerable接口,反之;
真正理解了的话,你会发现上面的两点其实是一句话,至于什么是Imnumerable接口,也就是所谓的迭代器,之后有机会我也会相关的做出总结文档,最后我们在上面的MyList多加一条数据list.Add("ddaad");你会发现并不会报错,那是因为我在遍历时给item用的var类型,那如果我把var改成int类型,程序就会报错了,所以我们的这个集合和C#里的ArrayList一样,在类型安全上有很大的问题,那怎么解决这个问题呢,答案就是泛型,下次总结文档我就把上面的代码改成用泛型实现,来对比一下普通集合与泛型集合的区别