일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- git
- .net
- programmers
- Binding
- string
- ListView
- csharp
- File
- C#
- windows
- WPF
- commit
- IValueConverter
- tls
- log
- nullable
- coding-test
- 코딩테스트
- mysql
- Process
- logging
- algorithm
- Coding
- dotNET
- convert
- chashtag
- Microsoft
- windows10
- Visual Studio
- Github
Archives
- Today
- Total
CHashtag
[C#] Collection for 값 변경시 System.InvalidOperationException 해결법 본문
반응형
아래와 같은 클래스가 있습니다.
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);
});
}
}
실행해보면 아래와 같은 예외가 발생합니다.
이는 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에서 확인하실 수 있습니다.
반응형
'C#' 카테고리의 다른 글
[C#] 파일 읽기, 저장하기 (UTF8) (0) | 2021.01.26 |
---|---|
[C#] 현재 메소드 이름 얻기 ( MethodBase.GetCurrentMethod() ) (0) | 2021.01.11 |
[ZOOM] [C#] [SDK] 2. C# Wrapper SDK 다운로드 & 프로젝트에 적용 (0) | 2020.11.21 |
[C#] DateTime nullable 에서의 ToString("yyyy-MM-dd") ?(System.InvalidOperationException) (0) | 2020.08.10 |
[ZOOM] [C#] [SDK] 1. ZOOM SDK, JWT APP 생성하기 (3) | 2020.07.28 |