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);
이것은 목록 내에서 반복하여 작동하며 사전을 형성하기 위해 수정한 키/요소 선택기 람다를 활용합니다.
여기에서 keySelector
및 elementSelector
매개변수는 쉽게 읽을 수 있도록 이러한 방식으로 언급됩니다.
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#
의 키에 대한 요소 목록
여기에서는 출시 연도에 따라 일부 시즌을 분류합니다. 매년 많은 시즌이 출시될 수 있습니다.
목록 사전을 얻기 위해 아래와 같이 다음 코드를 사용할 수 있습니다.
예제 코드:
#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 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