List.Foreach与C#的foreach的区别
几年前参加面试时就被提问过,现在面试别人时也经常提到这个问题。 今天小试了一下。得出如下几点:
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的区别的更多相关文章
- for,foreach,iterator的用法和区别
for,foreach,iterator的用法和区别 相同点: 三个都可以用来遍历数组和集合不同点:1.形式差别 for的形式是for(int i=0;i<arr.size();i++){. ...
- for-each、for-in和for-of的区别
for-each.for-in和for-of的区别 1.forEach()方法 用于调用数组的每个元素,并将元素传递给回调函数. 注意: forEach() 对于空数组是不会执行回调函数的. arra ...
- forEach、for-in与for-of的区别
forEach.for-in与for-of的区别 forEach介绍 objArr.forEach(function (value) { console.log(value); }); foreach ...
- 腾讯一面!说说ArrayList的遍历foreach与iterator时remove的区别,我一脸懵逼
本文基于JDK-8u261源码分析 1 简介 ArrayList作为最基础的集合类,其底层是使用一个动态数组来实现的,这里"动态"的意思是可以动态扩容(虽然ArrayList可 ...
- js中forEach,for in,for of的区别
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- forEach和map的用法和区别
forEach()和map()都是处理数组的高阶函数有相同的三个值:(currentValue,index,arr): currentValue:必选,当前元素的值,index:可选,当前元素的下标, ...
- javascript中forEach()和jquery中each()的区别
forEach是ES5中操作数组的一种方法,主要功能是遍历数组 1.forEach方法中的function回调有三个参数:第一个参数是遍历的数组内容,第二个参数是对应的数组索引,第三个参数是数组本身 ...
- Scala中的foreach forall exists map函数及其区别
forall 对集合中的元素进行某个判断,全部为true则返回true,反之返回false. 例如: scala> var s = List("hello", "w ...
- 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是编 ...
随机推荐
- SortedDictionary
对一个Dictionary<TKey, TValue>进行键排序可以直接用SortedDictionary SortedDictionary<TKey, TValue> 泛型类 ...
- 控制iframe高度
1. iframe自适应高度 <iframe id="iframe" src="#" frameborder="0" scrollin ...
- BZOJ 1047: [HAOI2007]理想的正方形
题目 单调队列是个很神奇的东西,我以前在博客写过(吧) 我很佩服rank里那些排前几的大神,700ms做了时限10s的题,简直不能忍.(但是我还是不会写 我大概一年半没写单调队列,也有可能根本没有写过 ...
- BZOJ1261: [SCOI2006]zh_tree
Description 张老师根据自己工作的需要,设计了一种特殊的二叉搜索树.他把这种二叉树起名为zh_tree,对于具有n个结点的zh_tree,其中序遍历恰好为(1,2,3,-,n),其中数字1, ...
- map容器的使用
1.map是STL容器中的一种,属于关联性容器.以key value的形式存储.key必须唯一.如果重复则插入失败.插入后按照key默认排序.必须要先声明命名空间:using namespace st ...
- Spring aop 原始的工作原理的理解
理解完aop的名词解释,继续学习spring aop的工作原理. 首先明确aop到底是什么东西?又如何不违单一原则并实现交叉处理呢? 如果对它的认识只停留在面向切面编程,那就脏了.从oop(Objec ...
- 【转】测试LibreOffice SDK 开发环境配置(Windows)
原文:http://www.aqcoder.com/blog/detail/id/7441186b-93fd-482c-b4d7-0facd1ee498d 下载与安装 LibreOffice 主页:h ...
- 用SYS_CONNECT_BY_PATH进行层级查询时的排序问题
用SYS_CONNECT_BY_PATH进行层级查询时, 对同一级别的节点进行排序,可以加order SIBLINGS by 子句实现 WITH N2 AS( SELECT n.ID, org.&qu ...
- 8天入门wpf(转)
8天入门wpf—— 第一天 基础概念介绍 8天入门wpf—— 第二天 xaml详解 8天入门wpf—— 第三天 样式 8天入门wpf—— 第四天 模板 8天入门wpf—— 第五天 数据绑定 8天入门w ...
- 使用OFBIZ 时,使用的键入提示。
对商品的键入提示 ,效果如图(当输入关键字时,会提示出相应的数据) 首先要引入相应的插件 页面字段 js方法