What is the best way to modify a list in a 'foreach' loop?

前端 未结 11 731
不思量自难忘°
不思量自难忘° 2020-11-22 05:23

A new feature in C# / .NET 4.0 is that you can change your enumerable in a foreach without getting the exception. See Paul Jackson\'s blog entry An Interest

相关标签:
11条回答
  • 2020-11-22 06:14

    I have written one easy step, but because of this performance will be degraded

    Here is my code snippet:-

    for (int tempReg = 0; tempReg < reg.Matches(lines).Count; tempReg++)
                                {
                                    foreach (Match match in reg.Matches(lines))
                                    {
                                        var aStringBuilder = new StringBuilder(lines);
                                        aStringBuilder.Insert(startIndex, match.ToString().Replace(",", " ");
                                        lines[k] = aStringBuilder.ToString();
                                        tempReg = 0;
                                        break;
                                    }
                                }
    
    0 讨论(0)
  • 2020-11-22 06:17

    As mentioned, but with a code sample:

    foreach(var item in collection.ToArray())
        collection.Add(new Item...);
    
    0 讨论(0)
  • 2020-11-22 06:17

    You can't change the enumerable collection while it is being enumerated, so you will have to make your changes before or after enumerating.

    The for loop is a nice alternative, but if your IEnumerable collection does not implement ICollection, it is not possible.

    Either:

    1) Copy collection first. Enumerate the copied collection and change the original collection during the enumeration. (@tvanfosson)

    or

    2) Keep a list of changes and commit them after the enumeration.

    0 讨论(0)
  • 2020-11-22 06:18

    To illustrate Nippysaurus's answer: If you are going to add the new items to the list and want to process the newly added items too during the same enumeration then you can just use for loop instead of foreach loop, problem solved :)

    var list = new List<YourData>();
    ... populate the list ...
    
    //foreach (var entryToProcess in list)
    for (int i = 0; i < list.Count; i++)
    {
        var entryToProcess = list[i];
    
        var resultOfProcessing = DoStuffToEntry(entryToProcess);
    
        if (... condition ...)
            list.Add(new YourData(...));
    }
    

    For runnable example:

    void Main()
    {
        var list = new List<int>();
        for (int i = 0; i < 10; i++)
            list.Add(i);
    
        //foreach (var entry in list)
        for (int i = 0; i < list.Count; i++)
        {
            var entry = list[i];
            if (entry % 2 == 0)
                list.Add(entry + 1);
    
            Console.Write(entry + ", ");
        }
    
        Console.Write(list);
    }
    

    Output of last example:

    0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 3, 5, 7, 9,

    List (15 items)
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    1
    3
    5
    7
    9

    0 讨论(0)
  • 2020-11-22 06:21

    You should really use for() instead of foreach() in this case.

    0 讨论(0)
提交回复
热议问题