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

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. 【温故Delphi】Win32API之GetTempFileName

    所遇问题 新建的算量工程文件暂时保存到临时文件中,代码中调用了Win32 API——GetTempFileName 但在一台笔记本上,函数返回了一个空字符串! 为了查明原因想到了好用的GetLastE ...

  2. HDU Game Theory

    5795 || 3032 把x个石子的堆分成非空两(i, j)或三堆(i, j, k)的操作->(sg[i] ^ sg[j])或(sg[i] ^ sg[j] ^ sg[k])是x的后继 #def ...

  3. 如何使用jcraft 模拟SFTP登陆

    大家如果熟悉Linux系统话,对ssh,sftp,scp等命令非常熟悉.ssh是一个安全协议,用来在不同系统或者服务器之间进行安全连接.ssh 在连接和传送的过程中会加密所有的数据. 而今天我要介绍的 ...

  4. 解析 Json 相关

    statusJson sj = new statusJson() { ShipmentNum = "555555", Status1 = "05", Wareh ...

  5. S2SH简介

    struts2简介 Struts2是由WebWork基础上发展起来的,与struts1比较,选用struts2的理由是:①Struts1要求Action类继承一个抽象基类,而Struts 2 Acti ...

  6. JS-随机函数

    // alert( Math.round(3.4) );// 0~1 : Math.round(Math.random());// 0~10// alert( Math.round(Math.rand ...

  7. Win7 64位 VS2015环境使用qt-msvc2015-5.6.0

    QT下载 http://www.qt.io/download-open-source/#section-2 我用的是 qt-opensource-windows-x86-msvc2015-5.6.0. ...

  8. Framework manager编写SQL错误整理

    BMT-MD-0059 这个报错是由于导入了表全部的列,而之引用了部分列,所以未被引用的列将要被删除 XQE-PLN-0248 在模型中找不到“MONTHLY_FORECAST_FACT”的列“mon ...

  9. Github 新的项目管理模式——Projects

    Github 新的项目管理模式--Projects Issues Github 中传统的项目管理是使用 issue 和 pull request 进行的,这部分内容不是本文重点,不再赘述. 但有一些功 ...

  10. A very cool thing: Install MYSQL from source without root access on LINUX

    最近由于工作的需要,要在centos上安装MYSQL服务器.作为一名小兵中的小兵,当然是没有root权限的,为了能够使用mysql,只能使用源码安装了(因为binary安装方式似乎需要root acc ...