关于C#集合,索引器,迭代器
C#集合,索引器,迭代器有哪里有文章讲的比较详细的?Thank you.(看的我撞墙才懂一点)。
C#集合,索引器,迭代器有哪里有文章讲的比较详细的?Thank you.(看的我撞墙才懂一点)。
答案:1.集合集合就如同数组,用来存储和管理一组特定类型的数据对象,除了基本的数据处理功能,集合直接提供了各种数据结构及算法的实现,如队列、链表、排序等,可以让你轻易地完成复杂的数据操作。在使用数组和集合时要先加入system.collections命名空间,它提供了支持各种类型集合的接口及类。集合本身上也是一种类型,基本上可以将其作为用来存储一组数据对象的容器,由于c#面向对象的特性,管理数据对象的集合同样被实现成为对象,而存储在集合中的数据对象则被称为集合元素。这里提到了接口这个概念,它也是面向对象编程进化的重要标准。
2. 索引器(Indexer)
索引器的出现,让我们首次感觉到真正意义上的容器类型或集合类型的存在。在它出现之前,要达到类似的效果,主要有两种选择:
1. 保存为数组,然后按照for(int i=0; i<arr.Length; i++)读取。
2. 提供一组get***(idx)和put/set***(idx)的方法。
虽然Java借鉴C#已经改进了很多,但是在Indexer上没有变化,相应的集合类型都是通过add、remove、get之类的方法读取。C#中的Indexer给人一种更“透彻”的感觉,集合类型就是集合类型,有自己专用但又最简洁的访问方式,而且同一种类型可以有不同的索引访问方式。
企业应用中存在非常多的编码:经营单位编码、货币类型编码、工作流步骤编码等,应用中常常把它们作为参数使用。回想一下我们在建立这些表的时候仅仅有一个PK(Primary Key),还是常常在PK之外,增加一些IDX(索引)呢?可能就一个PK,也可能是PK + IList<IDX>;Indexer也一样,可以有一个,也可以有多个。
3.迭代器(Iterator)
除了Template这个最自然面向对象的语言特性外,迭代器恐怕是C#可以提供的最简单的设计模式了。.NET Framework有自己的IEnumerator接口,还有Java觉得不错也“学”过去的foreach。迭代器的作用很明确:提供顺序访问一个内部组成相对复杂类型各个元素的手段,而客户程序无须了解那个复杂的内部组成。
工程环境中,除了Composite、Iterator两个基本的模式可以利用迭代器完成外,出于运行态检查或运行监控的需要,Facade、Flyweight、Interpreter、Mediator、Memento等类的行为性、结构型模式同样可以通过迭代器简化设计,因为它们内部都需要组织一系列对象,而遍历每个成员又是经常性的操作。
基本应用对同一个事物,不同人会有不同的看法。
对象也一样,虽然都是遍历,但是不同语境下、不同上下文限制下,要遍历的内容可能完全不同。正好,Iterator提供了这样一个机会,对于一个类型,您可以提供多个IEnumerable(泛型或非泛型的),同时还可以提供一个最基本的IEnumerator(泛型或非泛型的)。示例代码如下:
C#
using System;
using System.Collections;
using System.Collections.Generic;
namespace MarvellousWorks.PracticalPattern.Concept.Iterating
{
public class RawIterator
{
private int[] data = new int[]{0, 1, 2, 3, 4};
// 最简单的基于数组的全部遍历
// 如果客户程序需要强类型的返回值,可以采用泛型声明public IEnumerator<int>
public IEnumerator GetEnumerator()
{
foreach (int item in data)
yield return item;
}
// 返回某个区间内数据的IEnumerable
public IEnumerable GetRange(int start, int end)
{
for (int i = start; i <= end; i++)
yield return data[i];
}
// 手工“捏”出来的IEnumerable<string>
public IEnumerable<string> Greeting
{
get
{
yield return "hello";
yield return "world";
yield return "!";
}
}
}
}
Unit Test
[TestClass()]
public class RawIteratorTest
{
[TestMethod]
public void Test()
{
int count = 0; // 测试 IEnumerator
RawIterator iterator = new RawIterator();
foreach (int item in iterator)
Assert.AreEqual<int>(count++, item);
count = 1; // 测试具有参数控制的 IEnumerable
foreach (int item in iterator.GetRange(1, 3))
Assert.AreEqual<int>(count++, item);
string[] data = new string[] { "hello", "world", "!" };
count = 0; // 测试手工 “捏” 出来的 IEnumerable
foreach (string item in iterator.Greeting)
Assert.AreEqual<string>(data[count++], item);
}
}
上一个:C# 网络时间校准
下一个:C#中封装 两个原则是什么?