List.Foreach與C#的foreach的區別【轉】


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:集合已修改;可能無法執行枚舉操作。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM