C#

[C#]Dictionary 데이터 삭제하는 방법

DevStory 2022. 8. 20.

Dictionary 데이터 삭제 방법

C#의 Dictionary 클래스는 <Key, Value> 형식의 데이터를 가지는 컬렉션입니다.

 

Dictionary 클래스는 특정 키가 존재하면 데이터를 삭제하는 Remove() 메서드와 모든 데이터를 삭제하는 Clear() 함수를 제공합니다.

 

하지만, 키가 아닌 값을 기준으로 삭제하는 메서드는 제공하지 않습니다.

 

이번 포스팅은 Dictionary 클래스에서 제공하는 메서드와 LINQ에서 제공하는 기능을 사용하여 Dictionary의 데이터를 삭제할 수 있는 몇 가지 방법을 소개합니다.


방법 1. 특정 키가 존재하면 삭제

Dictionary 클래스에서 제공하는 Remove() 메서드를 사용하여 특정 키(Key)에 해당하는 데이터를 삭제할 수 있습니다.

 

Remove() 메서드의 매개변수로 키를 전달하면 데이터가 삭제됩니다. 정상적으로 삭제된 경우 true를 반환하고 그렇지 않으면 false를 반환합니다.

 

다음 예제는 string 타입의 키와 int 타입의 값을 가지는 Dictionary 객체에서 키가 "둘리"인 데이터를 제거하고 데이터 존재 여부를 Contaions() 메서드로 확인합니다.

class Program
{
  static void Main(string[] args)
  {
    Dictionary<string, int> dict = new Dictionary<string, int>()
    {
      {"둘리", 10 },
      {"마이콜", 20 },
      {"도우넛", 30 }
    };

    Console.WriteLine("Key가 \"둘리\"인 데이터가 존재하는가? " 
        + dict.ContainsKey("둘리"));

    Console.WriteLine("Key가 \"둘리\"인 데이터가 삭제되었는가? "
        + dict.Remove("둘리"));

    Console.WriteLine("Key가 \"둘리\"인 데이터가 존재하는가? "
        + dict.ContainsKey("둘리"));
  }
}

[실행 결과]

Key가 "둘리"인 데이터가 존재하는가? True
Key가 "둘리"인 데이터가 삭제되었는가? True
Key가 "둘리"인 데이터가 존재하는가? False

방법 2. 특정 값이 존재하면 삭제

Dictionary의 키(Key)는 유니크하므로 중복될 수 없지만, 값(Value)은 중복될 수 있습니다.

 

따라서, 특정 값에 해당하는 키가 여러 개 존재할 수 있습니다.

 

특정 값을 가지는 모든 데이터를 삭제하기 위해서는 특정 값에 해당하는 모든 키를 가져와야 합니다.

 

아래 포스팅은 특정 값을 가지는 키를 추출하는 다양한 방법을 소개합니다.

 

[C#]Dictionary 값에 해당하는 키 가져오는 방법

Dictonary 값에 해당하는 키 가져오는 방법 C#의 Dictionary는 형식의 데이터를 가지는 컬렉션입니다. Dictionary의 키(Key)는 유니크하므로 중복될 수 없지만, 값(Value)은 중복될 수 있습니다. 따라서, Dictio

developer-talk.tistory.com

다음 예제는 string 타입의 키와 int 타입의 값을 가지는 Dictionary 객체에서 값이 10 또는 30인 데이터를 삭제합니다.

 

반복문을 사용하여 특정 값에 해당하는 키를 List에 추가한 다음 List를 순회하여 특정 키에 해당하는 데이터를 삭제합니다.

class Program
{
  static void Main(string[] args)
  {
    Dictionary<string, int> dict = new Dictionary<string, int>()
    { 
      {"둘리", 10 },
      {"또치", 10 },
      {"마이콜", 20 },
      {"도우넛", 30 },
      {"고길동", 30 }
    };

    List<string> keyList = new List<string>();

    // Dictionary를 순회합니다.
    foreach (KeyValuePair<string, int> item in dict)
    {
      // Value가 10인 Key를 List에 추가합니다.
      if (item.Value == 10 || item.Value == 30)
      {
        keyList.Add(item.Key);
      }
    }

    // List를 순회하여 키에 해당하는 데이터를 삭제합니다.
    foreach (string key in keyList)
    {
      dict.Remove(key);
    }

    // 삭제 후 Dictionary의 데이터 확인
    foreach (KeyValuePair<string, int> item in dict)
    {
      Console.WriteLine("Key: " + item.Key + ", Value: " + item.Value);
    }
  }
}

[실행 결과]

Key: 마이콜, Value: 20

방법 3. LINQ의 Where 메서드

LINQ의 Where() 메서드는 배열 또는 컬렉션과 같은 데이터 집합에서 특정 조건을 만족하는 데이터를 반환하는 목적으로 사용됩니다.

 

Where() 메서드를 사용하면, Dictionary의 특정 값에 해당하는 데이터를 삭제할 수 있습니다.

 

먼저 LINQ의 Where() 메서드를 사용하기 위해 다음 네임스페이스를 추가합니다.

using System.Linq;

예제 1. 새로운 Dictionary 생성

Dictionary의 데이터를 삭제하는 방법은 아니지만, Where() 메서드를 사용하여 특정 값이 아닌 새로운 Dictionary 객체를 생성할 수 있습니다.

 

다음 예제는 string 타입의 키와 int 타입의 값을 가지는 Dictionary 객체에서 값이 10 그리고 30이 아닌 새로운 Dictionary를 생성함으로써 값이 10 또는 30인 데이터가 삭제되는 것처럼 보여줍니다.

 

LINQ의 Where() 메서드는 IEnumerable<T>를 반환하므로 Where() 메서드 뒤에 ToDictionary() 메서드를 사용합니다.

class Program
{
  static void Main(string[] args)
  {
    Dictionary<string, int> dict = new Dictionary<string, int>()
    { 
      {"둘리", 10 },
      {"또치", 10 },
      {"마이콜", 20 },
      {"도우넛", 30 },
      {"고길동", 30 }
    };

    Dictionary<string, int> newDict = dict
        .Where(item => item.Value != 10 && item.Value != 30)
        .ToDictionary(item => item.Key, item => item.Value);

    foreach (KeyValuePair<string, int> item in newDict)
    {
      Console.WriteLine("Key: " + item.Key + ", Value: " + item.Value);
    }
  }
}

[실행 결과]

Key: 마이콜, Value: 20

예제 2. 값에 해당하는 키 추출 후 기존 Dictionary의 데이터 삭제 

또 다른 방법으로 Where() 메서드를 사용하여 특정 값에 해당하는 키를 List로 추출한 뒤 List를 순회하여 Dictionary의 데이터를 삭제합니다.

 

다음 예제는 string 타입의 키와 int 타입의 값을 가지는 Dictionary 객체에서 값이 10 또는 30인 키를 추출한 뒤 Dictionary의 데이터를 삭제합니다.

class Program
{
  static void Main(string[] args)
  {
    Dictionary<string, int> dict = new Dictionary<string, int>()
    { 
      {"둘리", 10 },
      {"또치", 10 },
      {"마이콜", 20 },
      {"도우넛", 30 },
      {"고길동", 30 }
    };

    List<string> keyList = dict
        .Where(item => item.Value == 10 || item.Value == 30)
        .Select(item => item.Key)
        .ToList();

    // List를 순회하여 키에 해당하는 데이터를 삭제합니다.
    foreach (string key in keyList)
    {
      dict.Remove(key);
    }

    // 삭제 후 Dictionary의 데이터 확인
    foreach (KeyValuePair<string, int> item in dict)
    {
      Console.WriteLine("Key: " + item.Key + ", Value: " + item.Value);
    }
  }
}

[실행 결과]

Key: 마이콜, Value: 20

방법 4. 모든 키와 값을 삭제

마지막 방법으로 모든 키와 값을 삭제하는 방법입니다.

 

Dictioanry 클래스에서 제공하는 Clear() 메서드를 호출합니다.

class Program
{
  static void Main(string[] args)
  {
    Dictionary<string, int> dict = new Dictionary<string, int>()
    { 
      {"둘리", 10 },
      {"또치", 10 },
      {"마이콜", 20 },
      {"도우넛", 30 },
      {"고길동", 30 }
    };

    dict.Clear();

    Console.WriteLine("dict의 Count: " + dict.Count);
  }
}

[실행 결과]

dict의 Count: 0
반응형

댓글