Unity Tips

C# Dictionary를 foreach로 탐색할 때 Values 프로퍼티를 사용하세요

종잇장 2024. 10. 27. 14:45

안녕하세요

Dictionary를 Linq로 호출하는 성능 테스트 중에 이상한 점을 발견하여 블로그로 적게 되었습니다.

유니티 버전: 2022.3.44f1

 

 

foreach (var keypair in dictionary)
{
    if (keypair.Value.GroupID == groupID)
    {
        // ... //
    }
}

데이터를 찾기 편하게 Dictionary를 사용하는 경우가 많은데, 개발하다 보면 Key가 아닌 값으로 찾아야 하는 경우가 종종 있습니다.

이럴 때 위 코드처럼 foreach를 이용해서 찾게 됩니다.

 

 

https://learn.microsoft.com/ko-kr/dotnet/api/system.collections.generic.dictionary-2.values?view=net-8.0

 

Dictionary<TKey,TValue>.Values 속성 (System.Collections.Generic)

Dictionary<TKey,TValue>의 값을 포함하는 컬렉션을 가져옵니다.

learn.microsoft.com

그런데 대부분 Key값을 사용하는 경우가 없거나 Key값을 Value에서도 가지고 있기 때문에 실제로는 Value만 불러와도 됩니다.

C# Dictionary에는 Values 프로퍼티가 있는데, 이 프로퍼티를 이용하는 코드로 바꿔보겠습니다.

 

 

foreach (var v in dictionary.Values)
{
    if (v.GroupID == groupID)
    {
        // ... //
    }
}

이전에 Key와 Value를 모두 가져오는 코드에서 Value만 가져오는 코드로 전환했습니다.

 

 

왼쪽이 foreach문 그대로 실행, 오른쪽이 Values 프로퍼티를 통해 foreach문을 실행한 결과입니다.

걸리는 시간만 봤을 때는 2배 이상 차이가 납니다.

 

 

var results = dictionary
                .Where(_ => _.Value.x == value)
                .Select(_ => _.Value);
                        
var results = dictionary.Values
                .Where(_ => _.x == value);

물론 Linq를 이용할 때도 Select를 이용한다는 가정 하에 Values프로퍼티를 참조하는 게 더 빠릅니다.

 

 

 

결론

Dictionary에서 Value의 Key가 아닌 필드로 데이터를 찾는 경우, Values프로퍼티를 이용하는 것이 좋다.