几年前参加面试时就被提问过,现在面试别人时也经常提到这个问题。 今天小试了一下。得出如下几点:

1. 首先,mscorlib里System.Collections.Generic. List<T>类里有如下方法说明:

        //
// 摘要:
// 对 System.Collections.Generic.List<T> 的每个元素执行指定操作。
//
// 参数:
// action:
// 要对 System.Collections.Generic.List<T> 的每个元素执行的 System.Action<T> 委托。
//
// 异常:
// System.ArgumentNullException:
// action 为 null。
public void ForEach(Action<T> action);

2. 对于修改集合里的项时,两者都可以实现。


foreach (var item in list)
{
item.ApplyNo = "testNo" + list.IndexOf(item);
}
list.ForEach(item => item.ApplyNo = "testNo" + list.IndexOf(item));

3. List.Foreach可以增删集合项,而foreach不行。

public static void Main()
{
List<T_Info_PriorApplys> list = new List<T_Info_PriorApplys>();
list.Add(new T_Info_PriorApplys() { });
list.Add(new T_Info_PriorApplys() { });
list.ForEach(item => item.ApplyNo = "testNo" + list.IndexOf(item));
list.ForEach(p =>
{
if (p.ApplyNo == "testNo0")
{
list.Remove(p);
list.Insert(, new T_Info_PriorApplys { ApplyNo = "NewNo0-1" });
list.Add(new T_Info_PriorApplys { ApplyNo = "NewNo0-2" });
} }); list.ForEach(item => Console.WriteLine(item.ApplyNo));
Console.Read();
} /* 运行结果:
NewNo0-1
testNo1
NewNo0-2
*/

需说明的是,使用Foreach时,当集合的元素增加后,由于索引器是从0开始的,新的元素如果在当前索引的后面,则也会参与遍历,如果在当前索引前,则当前元素会再次参与遍历。  所以, 如果在改变元素个数时没有条件, 会导致死循环。代码见下方:

list.ForEach(p =>
{
list.Remove(p);
list.Insert(, new T_Info_PriorApplys { ApplyNo = "NewNo0-1" });
list.Add(new T_Info_PriorApplys { ApplyNo = "NewNo0-2" });
});

用 foreach实现上面的逻辑时, 当新增完元素之后,下一次迭代时,会报异常 System.InvalidOperationException:集合已修改;可能无法执行枚举操作。

List.Foreach与C#的foreach的区别的更多相关文章

  1. for,foreach,iterator的用法和区别

    for,foreach,iterator的用法和区别 相同点:   三个都可以用来遍历数组和集合不同点:1.形式差别 for的形式是for(int i=0;i<arr.size();i++){. ...

  2. for-each、for-in和for-of的区别

    for-each.for-in和for-of的区别 1.forEach()方法 用于调用数组的每个元素,并将元素传递给回调函数. 注意: forEach() 对于空数组是不会执行回调函数的. arra ...

  3. forEach、for-in与for-of的区别

    forEach.for-in与for-of的区别 forEach介绍 objArr.forEach(function (value) { console.log(value); }); foreach ...

  4. 腾讯一面!说说ArrayList的遍历foreach与iterator时remove的区别,我一脸懵逼

    本文基于JDK-8u261源码分析 1 简介 ​ ArrayList作为最基础的集合类,其底层是使用一个动态数组来实现的,这里"动态"的意思是可以动态扩容(虽然ArrayList可 ...

  5. js中forEach,for in,for of的区别

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. forEach和map的用法和区别

    forEach()和map()都是处理数组的高阶函数有相同的三个值:(currentValue,index,arr): currentValue:必选,当前元素的值,index:可选,当前元素的下标, ...

  7. javascript中forEach()和jquery中each()的区别

    forEach是ES5中操作数组的一种方法,主要功能是遍历数组 1.forEach方法中的function回调有三个参数:第一个参数是遍历的数组内容,第二个参数是对应的数组索引,第三个参数是数组本身 ...

  8. Scala中的foreach forall exists map函数及其区别

    forall 对集合中的元素进行某个判断,全部为true则返回true,反之返回false. 例如: scala> var s = List("hello", "w ...

  9. for、forEach、for-in与for-of的区别

    let arr=[1,2,3,4,5]; arr.b='100'; for for(let i=0;i<arr.length;i++){ console.log(arr[i]); } for是编 ...

随机推荐

  1. iOS 单例模式

    主要用于做应用程序的资源共享控制.用途很多⋯⋯ 实质为,单例是在程序声明周期里 有且仅有 被实例化过一次的类.为确保实例化的唯一,利用类的 类(static)方法来生成和访问对象. 至此,你便可以在程 ...

  2. 《uml大战需求分析》阅读笔记05

    <uml大战需求分析>阅读笔记05 这次我主要阅读了这本书的第九十章,通过看这章的知识了解了不少的知识开发某系统的重要前提是:这个系统有谁在用?这些人通过这个系统能做什么事? 一般搞清楚这 ...

  3. android 的数学公式图片转换

    在应用中的数学公式是不能直接以文本显示和输入的,包括在一些学习类网站上看到的公式,他们都是以gif图片的形式展示出来的.而怎么样生成各种各样的gif图片形式的数学公式呢,此处未作深入研究,我所知道的是 ...

  4. 我与solr(六)--solr6.0配置中文分词器IK Analyzer

    转自:http://blog.csdn.net/linzhiqiang0316/article/details/51554217,表示感谢. 由于前面没有设置分词器,以至于查询的结果出入比较大,并且无 ...

  5. STM32正交编码器驱动电机

    1.编码器原理        什么是正交?如果两个信号相位相差90度,则这两个信号称为正交.由于两个信号相差90度,因此可以根据两个信号哪个先哪个后来判断方向. 这里使用了TI12模式,例如当T1上升 ...

  6. 模板短信接口调用java,pythoy版(二) 阿里大于

    说明 功能:短信通知发送 + 短信发送记录查询,所有参数我没有改动,实测有效! 请自行参考 + 官方API! 短信模板示例:尊敬的${name},您的快递已在飞奔的路上,将在今天${time}送达您的 ...

  7. 个人博客作业week2——代码复审

    1.代码规范 这些规范都是官僚制度下产生的浪费大家的编程时间.影响人们开发效率, 浪费时间的东西. 代码规范并不是从官僚制度下产生,它是为了提高项目团队开发效率而产生的一种工具,能够极大的增强代码可读 ...

  8. java.util.zip.ZipException: invalid entry size 解决办法

    启动maven项目时报java.util.zip.ZipException: invalid entry size (expected 7612 but got 5955 bytes) 可能是mave ...

  9. ASDM through site to site VPN

    网上大部分文档只提到两个地方需要设置: 在6.2版本确实可以.但在7.2版本上只有用vpn client或anyconnect client连上的客户端可以用ASDM连上ASA,而通过site to ...

  10. TestNG教程

    TestNG教程 http://www.yiibai.com/testng/2013/0916311.html TestNG,3种执行方式: 1.ant(build.xml) 2.Eclipse(安装 ...