C# Collection Foreach 에서 원소 삭제하기

 

 

Dictionary에 담은 원소들을 한개씩 삭제해가면서 삭제가 성공하면 

다른 리스트에 담는 방식을 구현해야하는 경우가 있다.

public Dictionary<int, int> temporalItemDic;

public void InventoryFinalize()
{
    foreach (var item in temporalItemDic)
    {
        if (temporalItemDic.Remove(item.Key))
                AddItem(item.Key, item.Value);
    }
}

하지만, 위와 같은 enumeration에서 원소삭제는 Exception오류를 일으킨다!

 

 

 

이런 문제 때문에 리스트 등에서는 for문으로 맨 뒤에서부터 체크해야한다.

for (int i = monsterList.Count - 1; i >= 0; i--)
{
    if (monsterList[i] == null || monsterList[i].IsAlive == false)
        monsterList.RemoveAt(i);
}

혹은 LINQ를 사용하여 새로운 리스트를 소팅하고 덮어쓰는 방법도있다.

monsterList = monsterList.Where(n => n != null && n.IsAlive == true)
                         .ToList();

 

 

사실 LINQ가 있다면 Dictionary 뒤에 바로 .ToList()로 새로운 리스트로 만들어 버릴 수 있다.

때문에, 다음과 같이 처리할 수도있다!

 

public Dictionary<int, int> temporalItemDic;

public void InventoryFinalize()
{
    foreach (var item in temporalItemDic.ToList()) // ToList()
    {
        if (temporalItemDic.Remove(item.Key))
            AddItem(item.Key, item.Value);
    }
}

 

 

댓글

Designed by JB FACTORY