C#에서 여러 리스트 간의 공통 항목을 찾는 가장 빠른 방법
C#에서 컬렉션을 다룰 때, 여러 리스트 간의 공통 요소를 찾아야 하는 상황에 자주 직면하게 됩니다. 이는 특정 기준에 따라 결과를 필터링할 때 특히 유용합니다. 이 블로그 포스트에서는 공통 시나리오를 다루겠습니다: 여러 리스트 내에서 모든 리스트에 나타나는 Option
객체의 부분 집합을 신속하게 식별하는 방법입니다.
문제 설명
List<List<Option>> optionLists
와 같은 구조의 리스트를 가지고 있다고 가정해 보겠습니다. 이때 모든 N
리스트에 존재하는 Option
객체가 어떤 것인지를 확인해야 합니다. 이를 해결하기 위해서는 Option
객체의 평가는 특정 문자열 속성에 의해 결정된다는 사실을 알고 있어야 합니다. 예를 들어, option1.Value == option2.Value
와 같이 말이죠. 궁극적으로는 각 항목이 한 번만 나타나는 List<Option>
을 반환하고자 합니다.
해결책: 공통 옵션 찾기
이 문제를 해결하기 위해 C#의 LINQ (Language Integrated Query)를 활용할 수 있습니다. LINQ는 컬렉션을 쿼리하는 강력한 방법을 제공하여 우리의 사용 사례에 적합합니다. 아래는 이 작업을 수행하는 효과적인 코드 스니펫입니다:
var x = from list in optionLists
from option in list
where optionLists.All(l => l.Any(o => o.Value == option.Value))
orderby option.Value
select option;
코드 설명
LINQ 쿼리를 단계별로 살펴보겠습니다:
-
외부 From 절: 첫 번째 부분
from list in optionLists
는 우리의 주 리스트인optionLists
에 있는 각 리스트를 반복합니다. -
내부 From 절: 두 번째 부분
from option in list
는 현재 리스트 내의 각Option
에 접근합니다. -
Where 절: 이것이 해결책의 핵심 부분입니다:
- 조건
where optionLists.All(l => l.Any(o => o.Value == option.Value))
는 현재option
이optionLists
내의 모든 리스트에서 발견되는지를 확인합니다. Any
메소드는 현재 리스트l
내에 현재option
의Value
와 일치하는Value
를 가진Option o
가 존재하는지를 검사합니다.
- 조건
-
결과 정렬:
orderby option.Value
절은 결과로 나온Option
객체들을Value
에 따라 정렬합니다. -
Select 절: 마지막으로
select option
은 모든 적격 옵션을 컬렉션으로 모읍니다.
중요한 고려 사항
-
고유 값: 제공된 코드는 고유 선택을 포함하지 않으므로 동일한
Value
를 가진 여러Option
객체를 반환할 수 있습니다. 고유한Option
이 필요하다면 쿼리에.Distinct()
를 추가하는 것을 고려하십시오. -
성능: 리스트의 크기에 따라 이 접근 방식의 효율성은 상당합니다. LINQ 쿼리는 최적화되어 있으며 중간 크기의 데이터 세트에서도 잘 수행될 수 있습니다.
결론
C#에서 여러 리스트 간의 공통 항목을 찾는 것은 LINQ를 사용하여 효율적으로 수행할 수 있습니다. LINQ의 힘을 활용함으로써 복잡한 쿼리를 최소한의 코드 작업으로 수행할 수 있습니다. 이는 귀하의 코딩 프로세스를 가속화할 뿐만 아니라 코드의 가독성과 유지 관리성을 향상시킵니다.
이제 이러한 지식을 갖추었으므로, 프로젝트에서 이런 솔루션을 쉽게 구현하여 컬렉션을 더 간편하고 효율적으로 처리할 수 있습니다.