当前位置:编程学习 > C#/ASP.NET >>

关于C#集合,索引器,迭代器

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#中封装 两个原则是什么?

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,