(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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/305483.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python离群点检测_如何从熊猫DataFrame中检测峰点(离群值)

我有一个带有多个速度值的熊猫数据帧&#xff0c;这些速度值是连续移动的值&#xff0c;但它是一个传感器数据&#xff0c;因此我们经常在中间出现误差的情况下&#xff0c;移动平均值似乎也无济于事&#xff0c;所以我可以采用什么方法用于从数据中删除这些离群值或峰点&#…

普通故障处理流程

一般OA或者BOSS的用户报故障后流程如下。、从中心机房扫描微波如果基站端能扫描到&#xff0c;但是客户端无法扫描。基本可以排除 基站端设备正常&#xff08;除天线外&#xff09;。问题一般出在客户那里&#xff0c;比如客户端微波数据丢失&#xff0c;停电。天线问题&#x…

读书 | IT人如何直击本质洞察底层逻辑?

【好书共读】| 作者/Edison Zhou作为IT技术人&#xff0c;我们不仅要精进技术&#xff0c;也要在技术之外修炼自己的软能力。本质思考&#xff0c;是一种直击事物本质的能力&#xff0c;是思考“思考的方法”&#xff0c;是一切思考的原动力。我们不用担心这个能力在其他企业用…

内网通mac能用吗_纯干货!小容量Mac装外置硬盘Windows系统最完美的方案!(多图)...

很多用Mac 的同学都会碰到一个很头疼的问题&#xff0c;那就是对 Windows系统的需求&#xff0c;macOS系统虽好&#xff0c;但是很多专业性软件都没有Mac 版本(特别是对国内的用户)&#xff0c;这时大家就会对 Windows系统有需求了。这时候很多同学会想到使用虚拟机或者装 Boot…

卖shell看站什么意思_粤语俚语卖咸鸭蛋是什么意思?

点读&#xff1a;卖咸鸭蛋&#xff08;maai6 haam4 aap3 daan6&#xff09;点解&#xff1a;就是死了的意思点造句&#xff1a;粤&#xff1a;您搵丧彪啊&#xff0c;佢琴日去劈友唔小心赖咗嘢&#xff0c;宜家已经去咗卖咸鸭蛋啦~~普&#xff1a;你找丧彪吗&#xff0c;他昨天…

asp.net core安全事项(上)

隐藏web服务端信息创建一个asp.net core mcv web项目&#xff0c;运行&#xff0c;F12查看返回信息&#xff0c;如下图&#xff0c;会清晰看到服务端的类型是kestrel.有时安全检测要求不能显示服务端信息&#xff0c;这样在一定程度上能降低被 攻击的风险&#xff0c;具体代码如…

云水画中人,独立一江秋

转载于:https://blog.51cto.com/wuliguo/50014

python是c语言_python与c语言

广告关闭 腾讯云11.11云上盛惠 &#xff0c;精选热门产品助力上云&#xff0c;云服务器首年88元起&#xff0c;买的越多返的越多&#xff0c;最高返5000元&#xff01; python语言调用c语言进行扩展&#xff0c;或者增加程序的运行速度都是特别方便的。 同时还能获得与c或者c几…

aes算法实现c语言_以C语言实现归并排序为例,谈谈五大常用算法之一的“分治法”...

分治算法&#xff0c;顾名思义就是“分而治之”&#xff0c;即把规模较大的复杂问题拆分为若干规模较小的类似子问题&#xff0c;并逐个解决&#xff0c;最后再将各个子问题的解决结果合并&#xff0c;得到原始问题的结果的方法。这个技巧是很多高效算法的基础&#xff0c;例如…

一朝读码深似海,不读源码薪难升!读懂.NET5源码,到底多重要?

谈到源码分析&#xff0c;很多人会有这样的疑问&#xff1a;“.NET5的基本功能我已经掌握了&#xff0c;还有读源码的必要吗&#xff1f;”实际上&#xff0c;阅读源码不仅能够帮你更深刻地理解底层设计原理&#xff0c;提升你的系统架构能力和编码功力&#xff0c;还能让你知道…

50万数据生成6位数不重复字符串_R语言系列3:高级数据管理

R语言系列3&#xff1a;高级数据管理此文内容为《R语言实战》的笔记&#xff0c;人民邮电出版社出版。从高中电脑课学VB开始&#xff0c;大一课内开始学习C&#xff0c;到后来大二为了数模学习Matlab&#xff0c;到大三为了搞深度学习自学Python&#xff0c;到研究生之初学习St…

fcn网络训练代码_另辟蹊径,中科院自动化所等首次用图卷积网络解决语义分割难题...

使用 CNN 处理图像问题已经是常规操作&#xff0c;但此类方法会造成局部位置信息的损失。如何解决这个问题呢&#xff1f;来自中科院自动化所和北京中医药大学的研究者另辟蹊径&#xff0c;提出用图卷积网络解决语义分割问题。选自arXiv&#xff0c;作者&#xff1a;Yi Lu等&am…

盘点大厂的那些开源项目 - 小米科技

小米是一家以手机、智能硬件和IoT平台为核心的互联网公司&#xff0c;以智能手机、智能电视、笔记本等丰富的产品与服务。致力于让全球每个人都能享受科技带来的美好生活。“为发烧而生”是小米的产品概念。“让每个人都能享受科技的乐趣”是小米公司的愿景。小米公司应用了互联…

博主应邀参加YOCSEF虚拟化技术论坛

发布日期: 2007-11-18 中国计算机学会青年计算机科技论坛<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />CCF Young Computer Scientists & Engineers ForumYOCSEF于<?xml:namespace prefix st1 ns "urn:schema…

自定义依赖注解无效_最详细的自定义Spring Boot Starter开发教程

1.前言随着Spring的日渐臃肿&#xff0c;为了简化配置、开箱即用、快速集成&#xff0c;Spring Boot 横空出世。目前已经成为 Java 目前最火热的框架了。平常我们用Spring Boot开发web应用。Spring mvc 默认使用tomcat servlet容器&#xff0c; 因为Spring mvc组件集成了spring…

thinkpadt450s换键盘视频_ikbc c87 入门级有线机械键盘测评

大家好&#xff0c;我是胖虎。今天&#xff0c;写一写我当初买的第一把机械键盘「ikbc c87 茶轴」&#xff0c;非常好的入门级樱桃轴键盘&#xff0c;手感和键帽都很不错。ikbc c87 茶轴机械键盘小白&#xff0c;第一款入门级机械键盘买什么&#xff1f;这款ikbc c87和高斯 87C…

dotnet cli 5.0 新特性——dotnet tool search

dotnet cli 5.0 新特性——dotnet tool searchIntro.NET 5.0 SDK 的发布&#xff0c;给 dotnet cli 引入了一个新的特性&#xff0c;dotnet tool search&#xff0c;主要用于搜索 Nuget 上的 dotnet tool&#xff0c;这个命令会搜索 tool 的名称以及一些元数据&#xff0c; tit…

localhost 已拒绝连接_MySQL连接错误:Access denied for #x27;root#x27;@#x27;localhost#x27;

问题描述&#xff1a;笔者在Mac安装MySQL&#xff0c;但是当我连接到localhost本地服务器却被拒绝mysql -u root -p(1045, "Access denied for user rootlocalhost (using password: YES)")根据MySQL的反馈&#xff0c;可以得知&#xff0c;我输入的root密码应该不对…

ncl 添加点shp文件_气象编程 | NCL高效快速精准提取不规则区域内的格点数据

添加新云天气象主编微信或QQ&#xff1a;130188121&#xff0c;及时获取或发布气象升学、就业、会议、征稿及学术动态等信息&#xff01;通常情况下&#xff0c;要获取某个区域内的格点数据&#xff0c;如果要求不是很高&#xff0c;直接采取矩形框挑选方法——即锁定所需范围内…

2021技术领域趋势报告:Rust继续增长、低代码是重要趋势

喜欢就关注我们吧&#xff01;OReilly 发布了一份《2021 年编程、运维、AI 和云计算的发展方向》报告&#xff0c;该报告基于 OReilly 在线学习平台产生的数据&#xff0c;就技术行业的趋势进行了一番分析。编程语言方面&#xff0c;报告从使用情况、使用量的同比增长以及搜索查…