본문 바로가기
프로그래밍/기타

[C#] LINQ 집합 연산자

by 김시루시루르 2022. 1. 5.

이런거 .. C#이라고 써야하나. 유니티에서만 쓸 수 있는 기능이 아니니깐...

 

집합연산자! 두 집합(이랄까 배열?)의 원소들로 하는 연산입니다.

중학교 수학시간에 배우는 벤다이어그램을 생각하면 쉬울지도 ... 중학교과정 맞나? 여튼.

저도 얼마전에 알아서 후다닥 정리해봅니다.

 

이미지를 수학 배울때마냥 U부터 시작해버렸는데 정작 U는 쓸데가 없네


0. LINQ

집합 연산자 사용을 위해서는 아래의 using문을 써주셔야 합니다.

1
using System.LINQ;
cs

1. 합집합

두 집합의 합집합을 만듭니다. 합집합이니까, 중복된 요소는 한 번만 들어갑니다.

Union을 사용합니다.

1
2
3
4
5
6
7
int[] numA = { 0125679 };
int[] numB = { 13578 };
 
var interscetNum = numA.Union(numB);
 
foreach (int i in interscetNum)
    Console.Write(i + " "); //출력: 0 1 2 5 6 7 9 3 8 
cs

똑같은 int 배열 두 개를 해도 int[]로 선언할 수가 없더라고요...

오류 메세지의 안내에 따르면 var 대신 IEnumerable<int>를 사용해도 됩니다.

 

이렇게 하면 합집합을 바로 만들 수 있지만, 중복 요소를 제거하는 Distinct를 써서,

두 집합을 합친 채 중복 요소를 제거한다든가.. 하는 방법으로도 만들 수 있긴 합니다.


2. 교집합

여기를 구하는 부분. Intersect를 씁니다.

1
2
3
4
5
6
7
int[] numA = { 0125679 };
int[] numB = { 13578 };

var interscetNum = numA.Intersect(numB);
 
foreach (int i in interscetNum)
    Console.Write(i + " "); //출력: 1 5 7
cs

 

 

Count 등을 사용해서 교집합 원소의 수를 구하거나 할 수 있습니다. 다른것도 마찬가지지만...

풀어봤던 문제 중에 교집합 카운트를 사용하면 효율이 오르는 문제가 있길래 생각나서 (코슥)


3. 차집합

이 부분. Except를 사용해서 구할 수 있습니다.

A를 기준으로 한 이미지라 이런 식이지만, 물론 B를 기준으로 해서 B-A를 만들 수도 있습니다.

앞에 오는 집합에 대한 뒤에 오는 집합의 차집합입니다.

1
2
3
4
5
6
7
int[] numA = { 0125679 };
int[] numB = { 13578 };
 
var interscetNum = numA.Except(numB);
 
foreach (int i in interscetNum)
    Console.Write(i + " "); //출력: 0 2 6 9
cs

이 스크립트도 A에 대한 B의 차집합, A-B입니다.

댓글