Modifying list inside foreach loop

后端 未结 3 1419
暖寄归人
暖寄归人 2021-01-01 16:51

I have a construction similar to this (but a lot more complicated):

var list = new List();

// .. populate list ..

foreach(var item i         


        
相关标签:
3条回答
  • 2021-01-01 17:27

    Rather than use a foreach construct, a for loop would allow you to alter the list.

    for (var x = 0; x < list.Count; x++) {
    
    }
    
    0 讨论(0)
  • 2021-01-01 17:39

    It's hard to offer useful advice without knowing what kinds of edits are being made. The pattern that I've found is has the most general-purpose value, though, to just construct a new list.

    For example, if you need to look at each item and decide between removing it, leaving it as-is, or inserting items after it, you could use a pattern like this:

    IEnumerable<string> butcherTheList(IEnumerable<string> input)
    {
        foreach (string current in input)
        {
            if(case1(current))  
            {
                yield return current;
            }
            else if(case2(current))
            {
                yield return current;
                yield return someFunc(current);
            }
            // default behavior is to yield nothing, effectively removing the item
        }
    }
    
    List<string> newList = butcherTheList(input).ToList();
    
    0 讨论(0)
  • 2021-01-01 17:40

    Yes, you could break, if that's what you really want. An exception won't be thrown until the for loop tries to grab the next item from the list.

    But I've found it's easiest just to create and iterate across a copy of the list so you don't have to worry about it.

    foreach(var item in list.ToList())
    

    The added performance overhead of an extra, untouched list is generally negligible compared to the maintainability costs of more complex code.

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