zoukankan      html  css  js  c++  java
  • 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(0, 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(0, new T_Info_PriorApplys { ApplyNo = "NewNo0-1" });
                list.Add(new T_Info_PriorApplys { ApplyNo = "NewNo0-2" });
    });

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

     

  • 相关阅读:
    selenium 模拟键盘事件 复制粘贴、右键、回车等
    02安卓用户界面优化之(二)SlidingMenu使用方法
    02Android用户界面优化之(一)Android Fragment
    (九)Android权限系统
    Android SDK 在线更新镜像服务器资源
    (八)Android广播接收器BroadcastReceiver
    (七)Android中AIDL的应用与理解
    (六)Android中Service通信
    (五)认识Android中的Service
    Gradle中文乱码
  • 原文地址:https://www.cnblogs.com/buguge/p/4532601.html
Copyright © 2011-2022 走看看