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 쿼리를 단계별로 살펴보겠습니다:

  1. 외부 From 절: 첫 번째 부분 from list in optionLists는 우리의 주 리스트인 optionLists에 있는 각 리스트를 반복합니다.

  2. 내부 From 절: 두 번째 부분 from option in list는 현재 리스트 내의 각 Option에 접근합니다.

  3. Where 절: 이것이 해결책의 핵심 부분입니다:

    • 조건 where optionLists.All(l => l.Any(o => o.Value == option.Value))는 현재 optionoptionLists 내의 모든 리스트에서 발견되는지를 확인합니다.
    • Any 메소드는 현재 리스트 l 내에 현재 optionValue와 일치하는 Value를 가진 Option o가 존재하는지를 검사합니다.
  4. 결과 정렬: orderby option.Value 절은 결과로 나온 Option 객체들을 Value에 따라 정렬합니다.

  5. Select 절: 마지막으로 select option은 모든 적격 옵션을 컬렉션으로 모읍니다.

중요한 고려 사항

  • 고유 값: 제공된 코드는 고유 선택을 포함하지 않으므로 동일한 Value를 가진 여러 Option 객체를 반환할 수 있습니다. 고유한 Option이 필요하다면 쿼리에 .Distinct()를 추가하는 것을 고려하십시오.

  • 성능: 리스트의 크기에 따라 이 접근 방식의 효율성은 상당합니다. LINQ 쿼리는 최적화되어 있으며 중간 크기의 데이터 세트에서도 잘 수행될 수 있습니다.

결론

C#에서 여러 리스트 간의 공통 항목을 찾는 것은 LINQ를 사용하여 효율적으로 수행할 수 있습니다. LINQ의 힘을 활용함으로써 복잡한 쿼리를 최소한의 코드 작업으로 수행할 수 있습니다. 이는 귀하의 코딩 프로세스를 가속화할 뿐만 아니라 코드의 가독성과 유지 관리성을 향상시킵니다.

이제 이러한 지식을 갖추었으므로, 프로젝트에서 이런 솔루션을 쉽게 구현하여 컬렉션을 더 간편하고 효율적으로 처리할 수 있습니다.