C#에서 목록을 사전으로 변환

Rana Hasnain Khan 2024년2월15일
  1. C#에서 목록을 사전으로 변환
  2. C#에서 LINQ ToDictionary() 메서드를 사용하여 목록을 사전으로 변환
  3. C#의 Non-Linq 방법을 사용하여 목록을 사전으로 변환
C#에서 목록을 사전으로 변환

이 기사에서는 ToDictionary()를 사용하여 목록을 사전으로 변환하는 방법을 배우고 중복 키를 처리하는 방법에 대해서도 알아봅니다.

C#에서 목록을 사전으로 변환

목록을 사전으로 변환해야 하는 상황이 많이 있습니다. 목록을 사전으로 쉽게 변환할 수 있는 몇 가지 방법이 있습니다.

아래 예를 통해 이러한 방법에 대해 자세히 설명합니다.

C#에서 LINQ ToDictionary() 메서드를 사용하여 목록을 사전으로 변환

목록을 사전으로 변경하는 가장 쉬운 방법은 아래에 표시된 LINQ ToDictionary() 메서드를 사용하는 것입니다.

예제 코드:

#Csharp
using System.Linq;

var seasonList = GetSeasonsList();
var seasonsById = seasonList.ToDictionary(keySelector: s => S.Id, elementSelector: s => s);

이것은 목록 내에서 반복하여 작동하며 사전을 형성하기 위해 수정한 키/요소 선택기 람다를 활용합니다.

여기에서 keySelectorelementSelector 매개변수는 쉽게 읽을 수 있도록 이러한 방식으로 언급됩니다.

C#의 Non-Linq 방법을 사용하여 목록을 사전으로 변환

루프를 사용하여 LINQ가 아닌 방식으로 목록을 사전으로 변환할 수도 있습니다.

예제 코드:

#Csharp
var seasons = GetSeasonList();
var seasonById = new Dictionary<int, Season>();

foreach (var season in seasons) {
  seasonById.Add(season.Id, season);
}

non-LINQ 방식은 성능이 좋아졌기 때문에 사용을 권장하지만 선호도에 따라 둘 중 하나를 사용할 수 있습니다.

이러한 메서드에는 두 가지 유형의 요소 선택자를 사용할 수 있습니다. 하나는 암시적 요소 선택자이고 다른 하나는 명시적 요소 선택자입니다.

이 두 문장을 사용할 때 결과는 동일합니다. 아래와 같이 암시적 요소 선택기를 사용하겠습니다.

예제 코드:

#Csharp
var seasonsById = seasonList.ToDictionary(keySelector: s => s.Id, elementSelector: s => s);

아래와 같이 명시적인 요소 선택기를 사용합시다.

예제 코드:

#Csharp
var seasonById = seasonList.ToDictionary(keySelector: s => s.Id);

요소 선택기는 목록에 있는 항목을 정의하지 않은 경우 자동으로 요소로 사용합니다. 이는 속성 중 하나로 개체를 표시하는 동안 원하는 것일 수 있습니다.

C#의 중복 키

목록에 중복 키가 있을 수 있습니다. 이 시나리오에서 ToDictionary()System.ArgumentException인 예외를 표시합니다.

아래 표시된 코드의 도움으로 중복 키를 추가하려고 하면 동일한 키를 가진 항목이 이미 목록에 있음을 보여줍니다.

통사론:

#Csharp
Dictionary.Add(key, value)

위에 표시된 코드를 사용하면 동일한 예외가 발생합니다. 이것은 Dictionary.Add(key, value)를 사용하여 중복 키를 삽입하려고 할 때 발생하는 것과 동일한 예외입니다.

예외적으로 데이터에서 중복 키를 피할 수 있습니다.

데이터에 중복 키가 필요하면 키별로 그룹화하고 원하는 값을 선택해야 합니다. 아래에 설명된 대로 몇 가지 옵션을 살펴보겠습니다.

C#의 키에 대한 집계 값

우선 항목 수를 추정합니다. 우리는 단어를 반복할 수 있습니다.

이를 달성하려면 단어별로 그룹화해야 하며 개수를 집계로 설정해야 합니다.

아래와 같이 중복 키를 확인하는 데 사용할 예제를 살펴보겠습니다.

예제 코드:

#Csharp
var seasons = new List<string> { "You", "Breaking Bad", "Marvel", "You" };

var seasonCountMap =
    seasons.GroupBy(s => s).ToDictionary(keySelector: m => m.Key, elementSelector: m => m.Count());

foreach (var seasonCount in seasonCountMap) {
  Console.WriteLine($"{seasonCount.Key}={seasonCount.Value}");
}

출력:

C의 중복 키

C#의 키에 대한 요소 목록

여기에서는 출시 연도에 따라 일부 시즌을 분류합니다. 매년 많은 시즌이 출시될 수 있습니다.

목록 사전을 얻기 위해 아래와 같이 다음 코드를 사용할 수 있습니다.

예제 코드:

#Csharp
var seasonList = GetSeasonList();
var seasonByYear = seasonList.GroupBy(s => s.YearOfRelease)
                       .ToDictionary(keySelector: m => m.Key, elementSelector: m => m.ToList());

foreach (var seasonGroup in seasonByYear) {
  Console.WriteLine(
      $"{seasonGroup.Key}={string.Join(", ", seasonGroup.Value.Select(v => v.Name))}");
}

C#의 키가 있는 첫 번째 요소

중복 키의 경우 그룹을 설명하는 항목 중 하나를 선택해야 합니다. 그룹의 첫 번째 요소를 대표자로 선택할 수 있습니다.

예를 보겠습니다. 아래와 같이 연도별로 시즌을 나열하고 1년에 한 시즌만 선택했습니다.

예제 코드:

#Csharp
var seasonList = GetSeasonList();

var seasonsByYear = seasonList.GroupBy(s => s.YearOfRelease)
                        .ToDictionary(keySelector: m => m.Key, elementSelector: m => m.First());

Foreach(var season in seasonsByYear) {
  Console.WriteLine($"{season.Key}={season.Value.Name}");
}

C#에서 루핑하여 중복 확인

LINQ 방식 대신 루프 방식을 사용할 때 키가 존재하는지 확인해야 합니다. 이렇게 하면 중복을 쉽게 처리할 수 있습니다.

그리고 중복을 처리하는 방법을 완전히 자유롭게 선택할 수 있습니다.

예제 코드:

#Csharp
using System.IO;
using System;

class Program {
  static void Main() {
    var seasons = GetSeasonList();
    var seasonsByYear = new Dictionary<int, List<Season>>();
    foreach (var season in seasons) {
      if (!seasonByYear.ContainsKey(season.YearOfRelease)) {
        seasonByYear.Add(season.YearOfRelease, new List<Season>());
      }
      seasonByYear[season.YearOfRelease].Add(season);
    }
    foreach (var seasonGroup in seasonByYear) {
      Console.WriteLine(
          $"{seasonGroup.Key}={string.Join(", ", seasonGroup.Value.Select(m =>m.Name))}");
    }
  }
}

이 예에서는 매년 출시되는 시즌 목록을 생성했습니다. 함수는 키가 아직 지정되지 않았음을 확인하면 빈 목록을 표시한 다음 계절을 추가합니다.

Rana Hasnain Khan avatar Rana Hasnain Khan avatar

Rana is a computer science graduate passionate about helping people to build and diagnose scalable web application problems and problems developers face across the full-stack.

LinkedIn

관련 문장 - Csharp Dictionary

관련 문장 - Csharp List