澳门新葡萄京官网注册c# for 和 foreach

C# 数组中 Length 表示数组项的个数,是个特性。

1、IEnumerable<T>接口和IEnumerable接口

1给定长度 无需总结长度的 for比foreach循环成效高

而 Count(卡塔尔国 也是意味项的个数,是个法子,它的值和 Length 肖似。但实质上严苛地说
Count(卡塔尔国 不是数组的内容,而是 IEnumerable 的故事情节。那也是怎么 C# 2.0
时数组不可能用 Count(State of Qatar,而 3.0 后就可以用 Count(卡塔尔国 的始末。

金玉锦绣了IEnumerable接口的联谊注脚该聚积能够提供二个enumerator(枚举器State of Qatar对象,帮忙当前的遍历集结。IEnumerable接口独有一个分子GetEnumerator(卡塔尔(قطر‎方法。

2 在不鲜明长度 也许总计长度有总体性损耗的时候 用foreach比较方便

对于数组,据书上说用 Length 快于 Count(卡塔尔国。

澳门新葡萄京官网注册 1

 

所以日常景色:数组小编用 Length,IEnumerable(举例 List)笔者用 Count(卡塔尔国。

澳门新葡萄京官网注册 2

  • 2336

IEnumerator接口兑现了IEnumerator接口的聚集实现了从二个成分到另二个因素向前挪动的措施,同不经常间也得以任何时候重回伊始处。
IEnumerator接口是只读的。

循环语句是编制程序的着力语句,在C#中除去沿用C语言的循环语句外,还提供了foreach语句来贯彻循环。那么作者要说的就是,在循环操作中尽量利用foreach语句来达成。

归纳以下多少个成员

 

MoveNext(卡塔尔方法调治遍历指针移向集结的下多个成分。注意,遍历指针的伊始地点是汇聚中率先个要素的日前。要指向第二个元素,必需先调用贰次MoveNext(State of Qatar方法。该措施再次回到二个布尔值,要是成功遍历到下一个成分,则赶回true;即使指针移出末尾,则赶回false。

为了来更加好地印证为何要提倡使用foreach,用如下三种不一样措施来编排循环语句。

Reset(卡塔尔方法用于安装遍历指针指向开头地方,即聚集中首先个要素的日前。

        int[] nArray = new int[100];

Current属性再次回到会集中当前指标的援用。

 

 

        // Use “foreach” to loop array

2、ICollection<T>接口和ICollection接口

        foreach( int i in nArray )

该接口是IEnumerable接口的子接口,定义了聚众的深浅、IEnumerator接口和大器晚成道方法。在IEnumerable接口的根基上加码了以下职能。

            Debug.WriteLine( i.ToString() );

Count;该属性重返会集瓜月素的数量。

 

CopyTo(Array array, int
index卡塔尔(قطر‎;该方法用于实现从会集中拷贝成分到多少个风姿浪漫维数组中。

        // Use “for” to loop array

澳门新葡萄京官网注册 3

        for( int i = 0; i < nArray.Length; i++ )

3、IList接口和IList<T>接口

            Debug.WriteLine( nArray[i].ToString() );

ILIst接口包蕴以下措施和总体性

 

 

        // Another way using “for” to loop array

澳门新葡萄京官网注册 4

        int nLength = nArray.Length;

Add(卡塔尔国和Insert(卡塔尔国方法用于向聚聚集增多条目款项,使用索引来钦点项目要插入的职位,在那之中首成分的目录为0;Add(卡塔尔国将新条令增多到后面部分。

        for( int i = 0; i < nLength; i++ )

Remove(卡塔尔(قطر‎和RemoveAt(State of Qatar用于从列表中剔除条款。Clear(卡塔尔国用于删除全部规规矩矩。

            Debug.WriteLine( nArray[i].ToString() );

IndexOf和Contains(卡塔尔(قطر‎用于寻觅该列表。

 

this属性用于获取或设置索引内定的值。C#中得以运用[]运算符举行访问

很生硬,foreach语句很简短,可是它的亮点不仅在于此,它的频率也是参天的。也许过四人以为最终意气风发种的频率会更加高,因为外界上看着永不每回访谈援引类型的属性。可是它却是三者在这之中,功能最低的。因为C#是强类型检查,那么对于数组访问的时候,要对索引的有效值进行判定,那么对于最终风流洒脱种代码实际产生的成效有如上边的代码相符。

 

        // Another way using “for” to loop array

IList<T>接口

        int nLength = nArray.Length;

 

        for( int i = 0; i < nLength; i++ )

澳门新葡萄京官网注册 5

        {

ArrayList类
ArrayList类实际上是C#中的”动态数组”。数组在new创办后,其尺寸(Length卡塔尔是不可能更正的,而ArrayList中的数组成分的个数(Count卡塔尔是能够转移的,成分得以参与及移出。

            if( i < nArray.Length )

 

                Debug.WriteLine( nArray[i].ToString() );

4、IDictionary<Tkey,Tvalue>接口IDictionary

            else

 

                throw new IndexOutOfRangeException();

澳门新葡萄京官网注册 6

        }

IDictionary接口提供了生机勃勃组”关键字/值”的成团,Hashtable是IDictonary的多少个要害达成。

(书中这里有个别出入,经过网络朋友sozdream的晋升,在1.1条件下发掘最后风姿洒脱种方法是最快的,前两个的进程基本极度;通过Dissambly查看最终生机勃勃种循环方法所发生的代码,并不曾生出相仿于小说所说的这种索引检查。但是依旧不提议利用最终风流倜傥种,因为此措施对索引的论断某些脱节,特别是当循环中数组尺寸发生变化的时候,索引有效检查不恐怕即刻开展)

IDictionary接口是四个分包生机勃勃组”关键字/值”对的数据构造,每种值都由相应的根本字来定义。关键字和值能够是其它数据类型,关键字必须唯风流罗曼蒂克且非空。

 

Add(卡塔尔方法增加一个点名的基本点字和值的规行矩步到IDictionary接口。

foreach语句除了简洁和连忙外,还应该有超级多优点,接下去豆蔻年华一列举。

this属性检索内定关键字所对应的值。

 

Keys和Values属性分别重临满含全部首要字和值的聚合。

先是个正是并不是考虑数组最初索引是几,很六人唯恐从其余语言转到C#的,那么原来语言的发轫索引可能不是1,举例VB大概Delphi语言,那么在C#中动用数组的时候就免不了疑问到底使用0初步依然用1起来吧,那么使用foreach就能够幸免那类难点。

Remove(卡塔尔用于删除钦定关键字对应的条款。Clear(卡塔尔(قطر‎用于删除全体规行矩步。

 

GetEnumator(卡塔尔重回一个IDictionaryEnumerator,可用以遍历IDictionary接口。

第叁个好处正是对于多维数组操效用foreach就可怜简便了,举例:

 

        int[,] nVisited = new int[8,8];

IDictionaryEnumerator接口

        // Use “for” to loop two-dimension array

澳门新葡萄京官网注册 7

        for( int i = 0; i < nVisited.GetLength(0); i++ )

IDictionaryEnumerator接口基于IEnumerator接口,能够利用Entry属性检索当前条款标首要性字和值,只怕使用Key和Value属性分别检索。Entry属性重回二个DictionaryEntry对象。

            for( int j = 0; j < nVisited.GetLength( 1 ); j++ )

DictionaryEntry是二个值类型,包涵Key和Value三个字段,每一个字段都以多个指标援用。s

                Debug.WriteLine( nVisited[i,j].ToString() );

澳门新葡萄京官网注册 8

 

Hashtable类

        // Use “foreach” to loop two-dimension array

Hashtable(哈希表卡塔尔表示一个最首要字和值相关联的会见,它的集团格局能够高效地查找当中的值。

        foreach( int i in nVisited )

 

            Debug.WriteLine( i.ToString() );

HashMap和Hashtable及HashSet的区别

 

对此三个维度或越多维,foreach语句并非发生任何变化,而对此for语句来讲将要实行改革了,这里就非常少说了。

 

 

 

其多少个要说的正是foreach落成类型转变操作,这种显示恐怕因而如上的例证看不出任何意义,不过对于ArrayList之类的数据集来讲,这种操作就显得相比较出色,比如:

        // Init an arraylist object

        int[] nArray = new int[100];

        ArrayList arrInt = new ArrayList();

        arrInt.AddRange( nArray );

 

        // Use “foreach” to loop an arraylist

        foreach( int i in arrInt )

            Debug.WriteLine( i.ToString() );

 

        // Use “for” to loop an arraylist

        for( int i = 0; i < arrInt.Count; i++ )

        {

            int n = ( int ) arrInt[i];

            Debug.WriteLine( n.ToString() );

        }

 

末段要说的是使用foreach并不曾扩张财富选择,那句话听得多少难懂,由于对于后续了IEnumerable接口的花色数据,技巧选用foreach语句,那么对于利用foreach会访问IEnumerable接口中GetEnumerator方法来扩充枚举,那么对于如上的foreach语句,对应的语句实在经常来讲:

        IEnumerator it = arrInt.GetEnumerator() as IEnumerator;

        using( IDisposable disp = it as IDisposable )

        {

            while( it.MoveNext() )

            {

                int elem = ( int )it.Current;

                Debug.WriteLine( elem.ToString() );

            }

        }

 

也正是说在出了foreach之后对于IEnumerator的对象也进展Dispose管理。

 

对此foreach说了如此多好处,那么在选拔它是还是不是足以精妙入神呢。其实不是那样的,在foreach语句中有三个限定,第一不能够改进枚举成员,其次不要对聚焦实行删除操作。约等于之类三种格局都以不没错。

        // Use “foreach” to loop an arraylist

        foreach( int i in arrInt )

        {

            i++;//Can’t be compiled

            Debug.WriteLine( i.ToString() );

        }

 

        // Use “foreach” to loop an arraylist

        foreach( int i in arrInt )

        {

            arrInt.Remove( i );//It will generate error in run-time

            Debug.WriteLine( i.ToString() );

        }

 

那么对于如上多个操作,能够用for来促成,别的这里多说一句,正是对此一个记录集的多条数据删除难题,也是平时现身难题之处(论坛上有的时候问形似的难点),由于在部分记录聚焦举办删减的时候,在剔除操作之后相应的目录也发出了变动,那时的删除要扭转进行删减,差不离情势如下。

        // Use “for” to loop an arraylist

        for( int i = arrInt.Count – 1; i >=0; i– )

        {

            int n = ( int ) arrInt[i];

            if( n == 5 )

                arrInt.RemoveAt( i ); // Remove data here

            Debug.WriteLine( n.ToString() );

        }

 

除开那多个地点外,foreach能够基本适用于其余循环,因而对此循环的编排要硬着头皮使用foreach,因为它会令你的代码清晰简洁,又不失高效。

做如何事贵在百折不挠, 什么事都怕认真. 只要你认真起来你就能够不负任务!

发表评论

电子邮件地址不会被公开。 必填项已用*标注