当前位置: 首页 > 编程日记 > 正文

(1)学习数组,集合,IEnumerable接口,引申学习迭代器

发展:数组-->集合-->泛型

(1)数组

1. 数组数据结构是System.Array类的一个实例.
2. System.Array类的语法为
[SerializableAttribute]
[ComVisibleAttribute(true)]
public abstract class Array : ICloneable, IList, ICollection, IEnumerable
3. 下面看一个使用数组的例子(我称之为隐式实现)
protected void Page_Load(object sender, EventArgs e)
{
    string[] strArrName = new string[3] { "Jim", "Andy", "Sun" };
    foreach (string strName in strArrName)
    {
        lblName.Text += strName + ",";
    }
}
或者这样写
protected void Page_Load(object sender, EventArgs e)
{
    string[] strArrName = new string[3];
    strArrName[0] = "Jim";
    strArrName[1] = "Andy";
    strArrName[2] = "Sun";
    foreach (string strName in strArrName)
    {
        lblName.Text += strName + ",";
    }
}
显示结果如下
Jim,Andy,Sun,
4. 下面看另一个使用数组的例子(我称之为显式实现)
protected void Page_Load(object sender, EventArgs e)
{
    Array myArray = Array.CreateInstance(typeof(string), 3);
    myArray.SetValue("Jim", 0);
    myArray.SetValue("Andy", 1);
    myArray.SetValue("Sun", 2);
    foreach (string strName in myArray)
    {
        lblName.Text += strName + ",";
    }
}
显示结果如下
Jim,Andy,Sun,
5. 优点:可以高效的访问给定下标的元素;System.Array类有自己的C#语法,使用它编程非常的直观.
6. 缺点:在实例化时必须指定数组的大小,以后也不能添加,插入,删除元素.

(2)集合
1. 针对数组数据结构的缺点,我们使用集合数据结构.
2. 集合数据结构中的类都位于System.Collections命名空间中.
3. 说到集合,我们必须先了解几个接口.想具体了解以下接口,可参考(3)集合接口
3.1 IEnumerable接口和IEnumerator接口
3.2 ICollection接口
public interface ICollection : IEnumerable
3.3 IList接口
public interface IList : ICollection, IEnumerable
3.4 IDictionary接口
public interface IDictionary : ICollection, IEnumerable
4. 说明一下:
4.1 ICollection接口是System.Collections命名空间中类的基接口.
4.2 ICollection接口扩展IEnumerable;IDictionary和IList则是扩展ICollection的更为专用的接口.IDictionary实现是键/值对的集合,如Hashtable类.IList实现是值的集合,其成员可通过索引访问,如ArrayList类.
4.3 某些集合(如Queue类和Stack类)限制对其元素的访问,它们直接实现ICollection接口.
4.4 如果IDictionary接口和IList接口都不能满足所需集合的要求,则从ICollection接口派生新集合类以提高灵活性.

(3)IEnumerable接口和IEnumerator接口

1. 我的理解:只有实现了IEnumerable接口的数据结构类才能使用foreach语句,下面给出例子
//Person类
public class Person
{
    private string _firstName;
    private string _lastName;

    public string FirstName
    {
        get { return _firstName; }
    }
    public string LastName
    {
        get { return _lastName; }
    }

    public Person(string strFirstName, string strLastName)
    {
        this._firstName = strFirstName;
        this._lastName = strLastName;
    }
}
//PersonList集合,实现IEnumerable接口
public class PersonList : IEnumerable
{
    private Person[] _arrPerson;

    public PersonList(Person[] myArrPerson)
    {
        _arrPerson = new Person[myArrPerson.Length];
        for (int i = 0; i < myArrPerson.Length; i++)
        {
            _arrPerson[i] = myArrPerson[i];
        }
    }

    public IEnumerator GetEnumerator()
    {
        return new PeopleEnumerator(_arrPerson);
    }
}
//实现IEnumerator接口
public class PeopleEnumerator : IEnumerator
{
    private int _position = -1;
    public Person[] _arrPerson;

    public object Current
    {
        get
        {
            try
            {
                return _arrPerson[_position];
            }
            catch (IndexOutOfRangeException)
            {
                throw new InvalidOperationException();
            }
        }
    }

    public PeopleEnumerator(Person[] myArrPerson)
    {
        _arrPerson = myArrPerson;
    }

    public bool MoveNext()
    {
        _position++;
        return (_position < _arrPerson.Length);
    }

    public void Reset()
    {
        _position = -1;
    }
}
//集合的使用
protected void Page_Load(object sender, EventArgs e)
{
    Person[] myArrPerson = new Person[3]
    {
        new Person("John", "Smith"),
        new Person("Jim", "Johnson"),
        new Person("Sue", "Rabon"),
    };

    PersonList myPersonList = new PersonList(myArrPerson);
    foreach (Person myPerson in myPersonList)
    {
        lblName.Text += myPerson.FirstName + " " + myPerson.LastName + ",";
    }
}
6. 说明一下我的理解,定义了一个集合类,实现IEnumerable接口,则必须定义一个与之相应的实现IEnumerator接口的类,这样是不是很麻烦呢?

(4)迭代器
1. 使用迭代器可避免上述麻烦,修改代码,注意橙色部分
public class Person
{
    private string _firstName;
    private string _lastName;

    public string FirstName
    {
        get { return _firstName; }
    }
    public string LastName
    {
        get { return _lastName; }
    }

    public Person(string strFirstName, string strLastName)
    {
        this._firstName = strFirstName;
        this._lastName = strLastName;
    }
}

public class PersonList : IEnumerable
{
    private Person[] _arrPerson;

    public PersonList(Person[] myArrPerson)
    {
        _arrPerson = new Person[myArrPerson.Length];
        for (int i = 0; i < myArrPerson.Length; i++)
        {
            _arrPerson[i] = myArrPerson[i];
        }
    }

    public IEnumerator GetEnumerator()
    {
        //当编译器检测到迭代器时,它将自动生成IEnumerable或IEnumerable<T>接口的Current,MoveNext和Dispose方法. 
        for (int i = 0; i < _arrPerson.Length; i++)
        {
            yield return _arrPerson[i];
        }

    }
}
2. 深入研究迭代器,请见(4)迭代器
3. 参考:http://msdn2.microsoft.com/zh-cn/library/dscyy5s0(VS.80).aspx

转载于:https://www.cnblogs.com/miclu/archive/2007/11/01/945842.html

相关文章:

人工智能尴尬的2019:需要钱却没钱可烧了

作者 | 余洋洋编辑 | 张丽娟来源 | CV智识&#xff08;ID:CVAI2019)【导读】正需要钱的时候&#xff0c;钱却不够用了&#xff0c;人工智能领域缺钱与亟需钱的矛盾在今年集中体现了出来。2019年&#xff0c;中国人工智能领域的投融资热情大幅降低&#xff0c;交易量随之急剧下降…

WMI技术介绍和应用——WMI概述

今天&#xff0c;我要开始一系列关于微软WMI技术的介绍。通过之后若干节的介绍&#xff0c;我想WMI技术将为在windows平台上从事开发的朋友开启另外一扇窗。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 第一次接触WMI技术是在一年前&#xff0c;当时我接到…

综合技术 --@Autowired和@Resource

2019独角兽企业重金招聘Python工程师标准>>> 1.Autowired和Resource 的作用一样&#xff0c;都是自动注入 2.Autowired是按照byType自动注入&#xff0c;而Resource默认是按照byName自动注入。 3.Resource有两个属性比较重要&#xff0c;分别是name和type&#xff0…

CowNew开源团队新书《自己动手写开发工具》隆重上市

《自己动手写开发工具--基于Eclipse的工具开发》本书系统地介绍了SWT、Draw2D、GEF、JET等与Eclipse插件开发相关的基础知识&#xff0c;并且以实际的开发案例来演示这些知识的实战性应用&#xff0c;通过对这些实际开发案例的学习&#xff0c;读者可以非常轻松地掌握Eclipse插…

4000个“不会数学”的程序员出现大反转!居然能学AI,玩算法,搞逻辑!背后原因首次曝光...

不懂数学的程序员&#xff0c;尤其是在工作之后的一些瞬间&#xff0c;有多少次让你感受到数学的重要性&#xff1f;我们来看2个例子&#xff1a;写一行代码会用数学的程序员&#xff1a;我能分析除代码算法的时间复杂度与空间复杂度&#xff0c;不用写就知道这个算法的优缺点。…

WMI技术介绍和应用——VC开发WMI应用的基本步骤

在《WMI技术介绍和应用——WMI概述》中介绍了我们可以使用C、.net或者支持ActiveX技术的脚本语言来使用WMI。但是各种语言对WMI的控制能力是不同的&#xff0c;比如脚本语言只能用来从WMI获取数据或者接收事件通知。而C还可以编写WMI提供者和发送消息。和脚本语言相比&#xff…

WMI技术介绍和应用——使用VC编写一个半同步查询WMI服务的类

在《WMI技术介绍和应用——VC开发WMI应用的基本步骤》文中&#xff0c;我们介绍了VC使用WMI技术的基本框架。本节我将讲解封装和实现一个用于半同步查询WMI的类。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 我曾思考过如何编写一个比较有用的类&#xff0…

致被套基民:老基民的四点教训七点经验(ZT)

四点错误&#xff1a; 一是没有足够的耐心。比如我曾买入一只基金&#xff0c;上半年表现不好&#xff0c;在忍无可忍之下终于赎回&#xff0c;结果它在下半年股市调整时大放异彩&#xff0c;成为收益率的冠军&#xff1b; 二是只看高分红买基金&#xff0c;结果错过了几只净值…

千万用户同时在线,优酷智能档在双11“猫晚”直播如何防卡顿?

作者 | 阿里文娱高级技术专家肖文良出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; 导读&#xff1a;本文为阿里文娱高级技术专家肖文良在【阿里文娱2019双11猫晚技术沙龙】中的演讲&#xff0c;主要内容为如何通过优酷智能档&#xff0c;降低用户卡顿尤其是双11直播…

导航菜单:jQuery粘性滚动导航栏效果

粘性滚动是当导航在滚动过程中会占粘于浏览器上&#xff0c;达到方便网站页面浏览的效果&#xff0c;也是一种用户体验&#xff0c;下面我们看一下是怎么实现的&#xff1a; jQuery的 smint插件&#xff0c;也是一个导航菜单固定插件。当页滚动时&#xff0c;导航菜单会固定在顶…

如何用Python实现超级玛丽的人物行走和碰撞检测?

作者 | marble_xu编辑 | 郭芮出品 | CSDN博客在《如何用 Python 实现超级玛丽的界面和状态机&#xff1f;》这篇文章中我们讲解如何用代码实现界面和状态机&#xff0c;本文详解人物行走和碰撞检测的实现。功能介绍人物行走人物的行走速度这边分成水平方向&#xff08;X轴&…

WMI技术介绍和应用——查询正在运行的进程信息

在《WMI技术介绍和应用——使用VC编写一个半同步查询WMI服务的类》一文中&#xff0c;我们介绍到了一个半同步查询WMI类的框架。本文将是该技术的一个应用&#xff0c;介绍如何使用WMI技术查询正在运行的进程信息。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff…

20个经典要诀学好英语

出处&#xff1a;我学网互助论坛第一要诀&#xff1a;收听英语气象报告   有些教学录音带为配合初学者的学习&#xff0c;故意放慢语速&#xff0c;这对英语听力的训练是不够的。如果听语速正常的英语&#xff0c;初学者又会感到力不从心。英语气象报告的速度虽快&#xff0c…

ArduinoYun教程之通过网络为Arduino Yun编程

ArduinoYun教程之通过网络为Arduino Yun编程 Arduino Yun的软件部分 通过第一章的介绍后读者就明白了Arduino Yun除了是一个类似其他Arduino的单片机之外&#xff0c;它的另一大组成部分就是运行着一个特殊Linux发行版的Atheros AR9331芯片。所以&#xff0c;本章将会介绍Ather…

WMI技术介绍和应用——查询正在运行的线程信息

本文使用了《WMI技术介绍和应用——使用VC编写一个半同步查询WMI服务的类》中代码做为基础。 一般来说&#xff0c;如果试图枚举系统中的线程。需要先枚举系统中的进程&#xff0c;然后再枚举每个进程中的线程。而WMI给我们提供了一种比较简便的枚举线程信息的方法。&#xff0…

开源生态也难逃“卡脖子”危机?中国AI开发者的警醒和突围

开源不是一个新名词&#xff0c;也不是一个新行动。软件时代&#xff0c;开源推动了全球范围的创新技术成果落地&#xff0c;从而促进全球信息技术发生了全局性、持续性的重大变革&#xff0c;这使它甚至成为一条非常关键且成功的技术路线。随着AI时代的来临&#xff0c;阿里、…

Linux下应用软件的安装

对于刚刚接触Linux的朋友来说,安装一些应用软件是一件头疼的事,因为在Linux下安装应用软件和Windows下截然不同的&#xff0c;下面介绍一下Linux下安装应用软件来解决刚刚接触Linux而不会安装软件朋友的困惑.Linux下软件包有两种比较常见的形式,一种是以 RPM、deb包为代表的智能…

Hibernate 的 session.load()使用方法

2019独角兽企业重金招聘Python工程师标准>>> protected Person getOne(int id){ Session session HibernateSessionFactory.getSession(); Person person new Person(); try{ session.load(person, id); }catch(Exception e){ e.printStackTrace(); }final…

WMI技术介绍和应用——查询桌面信息

本文使用了《WMI技术介绍和应用——使用VC编写一个半同步查询WMI服务的类》中代码做为基础。 在Windows操作系统中&#xff0c;存在很多Windows Station。而每一个Windows Station又存在一个或者多个Windows Desktop。我们一般所说的桌面只是这些众多桌面中的一个。以下内容将介…

联泰集群发布水晶系列工作站,用于深度学习场景

北京时间2019年12月26日&#xff0c;联泰集群在北京正式发布了水晶系列工作站产品 W722、W7224和W5232。 联泰集群硬件产品技术中心总监刘振锋、软件产品技术中心总监孙建军、硬件产品技术中心工程师肖学文分别从应用方向、水晶工作站一体化软件平台及水晶系列产品硬件方面对本…

航空黑客私人YY

坐飞机从从云南飞回老家广州~~~当然绝对支持深圳航空啦!嘎嘎!为啥?当然是服务好 MM太PL了!呵呵!而且在看杂志的同时还看到了一则新闻 内容如下 近日&#xff0c;深圳航空公司与瑞士OnAir公司在香港签约&#xff0c;合作推动在飞机上实现万米高空的自由通信。2008年奥运会前&am…

Redis安装整理(window平台) +php扩展redis

window平台Redis安装 redis windows安装文件下载地址:http://code.google.com/p/servicestack/wiki/RedisWindowsDownload#Download_32bit_Cygwin_builds_for_Windows我选择的redis为最新版的安装文件&#xff0c;见下图&#xff1a; Redis安装文件解压后&#xff0c;有以下…

WMI技术介绍和应用——查询环境变量

本文使用了《WMI技术介绍和应用——使用VC编写一个半同步查询WMI服务的类》中代码做为基础。 我们可以通过系统属性查看当前系统和当前用户的环境变量。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 如何使用WMI枚举所有环境变量的信息&#xff1f; CSynQue…

想学新的编程语言?考虑下Go吧

作者 | Lewis Fairweather译者 | 弯月&#xff0c;责编 | Elle来源 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;【导读】快速的运行时、高效的并发、简单易学的语法&#xff0c;这些都是Go语言最吸引人的特性。以下为译文&#xff1a;Go语言的入门门槛之低令我感到惊…

oracle学习总结三(bulk collect用法)

通过bulk collect减少loop处理的开销发表人:logzgh | 发表时间: 2006年五月19日, 10:56采用bulk collect可以将查询结果一次性地加载到collections中。而不是通过cursor一条一条地处理。可以在select into,fetch into,returning into语句使用bulk collect。注意在使用bulk coll…

MQTT的学习研究(五) MQTT moquette 的 Blocking API 发布消息服务端使用

参看官方文档&#xff1a; http://publib.boulder.ibm.com/infocenter/wmqv7/v7r0/index.jsp?topic/com.ibm.mq.amqtat.doc/tt00000_.htm * Java 为 MQ Telemetry Transport 创建异步发布程序 *在此任务中&#xff0c;您将遵循教程来修改第一个发布程序。通过修改&#xff0c…

WMI技术介绍和应用——查询驱动信息

本文使用了《WMI技术介绍和应用——使用VC编写一个半同步查询WMI服务的类》中代码做为基础。 如何使用WMI查询所有驱动信息&#xff1f;&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; CSynQueryData recvnotify(L"root\\CIMV2",L"SELECT * FR…

NumericUpDown

NumericUpDown控件主要功能是为一个TextBox控件添加上下按钮&#xff0c;当单击按钮时实现数字的加减&#xff0c;同时也可以提供静态数据&#xff0c;实现这些数据的上下选择。 属性列表&#xff1a; TargetControlID&#xff1a;该控件的目标作用控件。 Width&…

提高建模效率,改变手工作坊式生产,AutoML的技术研究与应用进展如何了?

整理 | 王银出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;【导读】12 月 5-7 日&#xff0c;由中国计算机学会主办&#xff0c;CCF 大数据专家委员会承办&#xff0c;CSDN、中科天玑协办的中国大数据技术大会&#xff08;BDTC 2019&#xff09;在北京长城饭店隆重举…

.net使用memcached

Windows中memached安装 -------------服务器端配置 1>开始>运行:CMD(确定) 2>cd C:\memcached&#xff08;回车&#xff09; 3>memcached -d install(回车 这步执行安装) 4>memcached -d start(回车 这步执行启动memcache服务器&#xff0c;默认分配64M内存&…