본문 바로가기

C#

C# Dictionary의 ValueComparer 커스터마이징

C# Dictionary는 기본적으로 키의 비교를 위한 Comparer를 제공하지만, 값(Value)에 대한 비교도 커스터마이징이 필요한 경우가 있습니다. 이 글에서는 Dictionary의 Value 비교를 직접 제어하는 방법과 커스텀 ValueComparer 구현법을 소개합니다.

1. ValueComparer란?

ValueComparer는 Dictionary에서 값 비교를 사용자 정의할 수 있게 해주는 기능입니다. 기본적으로 Dictionary는 키를 기준으로 동등성을 판단하지만, 값 비교 로직을 바꾸고자 할 때 활용할 수 있습니다.

2. Dictionary에서 기본 Comparer 사용법

Dictionary 생성 시에 키에 대한 Comparer는 쉽게 지정할 수 있습니다. 그러나 값 비교를 직접 지정할 수 있는 API는 없으므로, ValueComparer를 직접 작성하여 활용해야 합니다.

3. ValueComparer 커스터마이징 예제

아래 예제는 ValueComparer를 커스터마이징하여 Dictionary의 값 비교 방식을 바꾸는 방법입니다. 예로서 대소문자 구분 없이 문자열 값을 비교합니다.

using System;
using System.Collections.Generic;
using System.Collections.Immutable;

class Program
{
    static void Main()
    {
        // 대소문자 구분 없이 값을 비교하는 ValueComparer 생성
        var valueComparer = new ValueComparer(
            (v1, v2) => string.Equals(v1, v2, StringComparison.OrdinalIgnoreCase),
            v => v.ToLowerInvariant().GetHashCode(),
            v => v
        );

        // ImmutableDictionary 생성 시 ValueComparer 적용(예시)
        var dict = ImmutableDictionary.Create(valueComparer).Add("Key", "Value");

        Console.WriteLine(dict.ContainsValue("value")); // True
    }
}

위 예제는 ValueComparer<T>를 통해 값 비교 기준을 명확하게 정의하고, ImmutableDictionary와 같은 컬렉션에 적용한 예입니다. 일반 Dictionary에서는 ValueComparer 직접 지정 기능이 제한적이므로, 값 비교가 필요한 경우 별도의 로직으로 처리해야 합니다.

4. 정리

C#에서 Dictionary는 기본적으로 키 비교에 집중합니다. 값(Value) 비교를 커스터마이징하려면 ValueComparer를 활용하거나 별도의 비교 로직을 구현하는 방식을 선택해야 합니다. 특히 Immutable 컬렉션에서는 ValueComparer 지원이 강력하니 필요에 맞게 사용해보시기 바랍니다.