foreach用法|百度图书馆

电脑杂谈  发布时间:2020-05-09 02:04:49  来源:网络整理

foreach_foreach foreach_parallel.foreach

Foreach使用循环语句是编程的基本语句. 在C#中,除了遵循C语言的loop语句外,还提供了foreach语句来实现循环. 所以我想说的是,尝试在循环操作中使用foreach语句. 为了更好地解释为什么您应该促进使用foreach,请通过以下三种不同方式编写循环语句. int [] nArray =新的int [100]; //使用“ foreach”循环遍历数组foreach(nArray中的int)Debug.WriteLine(i.ToString()); //使用“ for”为(int i = 0; i foreach语句非常简洁,但它的优点不仅在于此,其效率也最高.

foreach foreach_parallel.foreach_foreach

也许很认为最后一个会更有效,因为似乎您不需要每次都访问引用类型的属性. 但是,这是三者中效率最低的. 由于对C#进行了严格的类型检查,因此在访问数组时,必须判断索引的有效值,因此最后一个代码的实际效果与以下代码相同. //使用“ for”循环数组int的另一种方法nLength = nArray.Length; for(int i = 0; i foreach语句除了简洁和效率外,还具有许多优点. 以下是列表.

第一个是不考虑数组的起始索引. 很可能会从其他语言切换到C#,然后原始语言的起始索引可能不是1,例如VB或Delphi语言,然后在C#中使用数组,当您以0或1,您可以通过使用foreach避免此类问题. 第二个优点是使用foreach进行多维数组操作非常简单,例如: int [,] nVisited = new int [8,8]; //使用“ for”为(int i = 0; i foreach”循环二维数组foreach(在nVisited中的int)Debug.WriteLine(i.ToString());对于三维或更多维而言,不需要更改foreach语句,但是对于必须修改for语句的情况,我在这里不再赘述.

要说的第三件事是,foreach完成了类型转换操作,通过以上示例,该实施例可能看不到任何效果foreach,但是对于ArrayList和其他数据集,此操作更为突出,例如: //初始化一个arraylist object int [] nArray = new int [100]; ArrayList arrInt = new ArrayList(); arrInt.AddRange(nArray); //使用“ foreach”循环一个数组列表foreach(int in arrInt)Debug.WriteLine(i.ToString()); //使用“ for”为(int i = 0; i foreach不会增加资源的使用. 这句话有点难以理解. 因为对于继承IEnumerable接口的类型数据,您可以使用foreach语句. foreach将访问IEnumerable接口中的GetEnumerator方法进行枚举,然后对于上面的foreach语句,相应的语句实际上如下: IEnumerator它= arrInt.GetEnumerator()作为IEnumerator;使用(IDisposable d isp =它作为IDisposable){while(it.MoveNext())(int elem =(int)it.Current; Debug.WriteLine(elem.ToString());}}也就是说,对于IEnumerator foreach该对象还执行Dispose处理.

关于foreach的好处很多,所以使用它无可挑剔吗?实际上,事实并非如此. 在foreach语句中有两个限制. 首先,枚举成员无法修改,其次,不要删除集合. 也就是说,以下两种方法是错误的. //使用“ foreach”循环一个数组列表foreach(int i in arrInt){i ++; //无法编译Debug.WriteLine(i.ToString());} //使用“ foreach”循环一个数组列表foreach(arrInt中的int){arrInt.Remove(i); //这会在运行时Debug.WriteLine(i.ToString());}中生成错误. 然后对于上面的两个操作,您可以使用来实现,此外我还要说一件事,它也是一个地方记录集的多个数据删除经常会出现问题的地方(在论坛上经常会问类似的问题),因为在某些记录集中删除时,删除操作之后的相应索引也有所更改,并且在此处删除时间将被反向删除. 通用形式如下.

//使用“ for”循环一个数组列表,用于(int i = arrInt.Count-1; i> = 0; i--){int n =(int)arrInt [i];如果(n == 5)arrInt.RemoveAt(i); //在此处删除数据Debug.WriteLine(n.ToString());}除了这两个地方,foreach基本上可以应用于任何循环,因此对于循环编写,请尝试使用foreach,因为它将使您的代码清晰简洁但高效. 因为这是从类集合中删除元素. 这将遍历整个集合,而foreach是遍历的新事物. 自然使用. 因此foreach,代码类似于以下内容: string temp = name.Text; //从TextBox foreach读取数据(Data.myCourse中的LCour cou)//遍历列表 {if(cou.name == temp)//判断cou的名称与{Data.myCourse.Remove(cou ); //匹配项将被删除,将中断从列表中删除; //跳出循环}}很容易想到以这种方式使用foreach,这似乎是正确的.

但是,印象中关于foreach的注意点是它仅适用于遍历阅读,不能修改. 上面的代码已成功删除. 这样,矛盾的就种在了我的心上. foreach到底是什么?过程: 我阅读了MSDN文档,但是文档中的示例使用遍历来读取每个元素,因此不是很有帮助. 相关的测试,异常和编译错误很有用. 处理的详细信息和摘要: 1.自定义整数数组,然后遍历并修改foreach(myArray中的int myint){myint + = 8;}错误1“ myint”是“ foreach迭代变量”,无法对其进行赋值G: \ TEST \ VS..C#\ testforeach \ Program.cs 15 27 testforeach 2,自定义类,在该类中定义对私有成员进行操作的函数,然后遍历该类对象并调用函数public class MyClass //自定义测试类{private int i = 0; public void change(){i = 98;}公共重写字符串ToString(){返回i.ToString();}} MyClass [] myTest = new MyClass [10]; //测试代码片段foreach(myTest中的MyClass mc){mc.change(); Console.WriteLine(mc.ToString());}通过了编译,但是引发了一个异常NullRefferenceException,未将对象引用设置为该对象的实例.

3,就像测试开始时的示例一样,有一些细微的变化. 删除后,您无需中断List myString = new List ();. myString.Add(“ ab”); myString.Add(“ cd”); foreach(myString中的字符串s){myString.Remove(s);}已通过编译,但是在运行时引发了一个异常InvalidOperationException,该集合已被修改;可能无法执行枚举. 通过上面的三个测试示例和开始时的实际示例,我似乎看到了一些建议. 首先,不能修改的是foreach参考变量,因为它是参考,并且其修改没有任何意义或影响. 就像c / c ++指针一样,它指向对集合中元素的引用. 我们可以通过引用看到它,但是没有能力移动它. 其次,in之前的变量是一个参考变量,但是in后面的集合确实是真实的,因此可以对其进行操作. 诸如.ADD();之类的方法;可以使用REMOVE(). 第三,foreach引用变量可能通过地址引用以下集合(我想它与c / c ++的指针非常相似). 修改集合的元素时,地址可能会以某种方式更改,因此请不要跳出循环并继续遍历. 可能会发生找不到引用的情况. 最后,这可能是不准确的,但这是我所了解的. 首先,赞美自己的想法和精神. 至于技术深度,可能什么都不是. 哈哈,坚持不懈.


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-203593-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      • 薛石平
        薛石平

        北洋海军强在定远镇远的铁甲巨炮

      • 李涵虚
        李涵虚

        他们敢来我们海巡逻

      热点图片
      拼命载入中...