CHashtag

[C#] Collection for 값 변경시 System.InvalidOperationException 해결법 본문

C#

[C#] Collection for 값 변경시 System.InvalidOperationException 해결법

HyoSeong 2020. 10. 26. 01:06
반응형

아래와 같은 클래스가 있습니다.

class Program
{
    internal static List<string> Items = new List<string>();

    static void Main(string[] args)
    {
        AddDummyValues();
        RemoveDummyValues();
    }

    internal static void AddDummyValues()
    {
        for(int i = 0; i< 100; i++)
        {
            Items.Add("Dummy_" + i);
        }
    }

    internal static void RemoveDummyValues()
    {
        Items.ForEach(x =>
        {
            Items.Remove(x);
        });
    }
}

실행해보면 아래와 같은 예외가 발생합니다.

 

System.InvalidOperationException 컬렉션이 수정되었습니다. 열거 작업이 실행되지 않을 수도 있습니다.

이는 Remove 뿐만 아니라 Add를 해도 동일한 예외가 발생합니다.

원인은 인덱싱에 변화가 생겨 발생하는 것입니다.

 

Dictionary에서도 동일한 이유로 에러가 발생합니다.

class Program
{
    internal static Dictionary<string, string> Items = new Dictionary<string, string>();

    static void Main(string[] args)
    {
        AddDummyValues();
        RemoveDummyValues();
    }

    internal static void AddDummyValues()
    {
        for (int i = 0; i < 100; i++)
        {
            Items["Dummy_" + i] = "";
        }
    }

    internal static void ModifyDummyValues()
    {
        foreach(var item in Items)
        {
            Items[item.Key] = "Dummy";
        }
    }
}

 

예외를 피하는 방법은 간단합니다.

Collection을 직접 foreach하는것이 아닌 Collection.ToList()를 이용하면 됩니다.

internal static List<string> Items = new List<string>();

internal static void RemoveDummyValues()
{
    Items.ToList().ForEach(x =>
    {
        Items.Remove(x);
    });
}
internal static Dictionary<string, string> Items = new Dictionary<string, string>();

internal static void ModifyDummyValues()
{
    foreach(var item in Items.ToList())
    {
        Items[item.Key] = "Dummy";
    }
}

 

전체 코드는 github.com/Hyo-Seong/CHashtag/tree/master/Foreach_InvalidOperationException에서 확인하실 수 있습니다.

 

Hyo-Seong/CHashtag

https://chashtag.tistory.com/. Contribute to Hyo-Seong/CHashtag development by creating an account on GitHub.

github.com

 

반응형