2024. 8. 24. 13:53ㆍVB.NET
List의 LINQ를 이용하면 정말 다양한 작업을 할 수 있는데, 이번 시간에는 중복제거에 대해 알아보도록 하자.
상황별로 조금씩 다른 방법을 사용해야 하니 우선 가상의 상황을 만들어보고 그 상황에 맞게 처리해보도록 하자.
1. 현재 리스트에서 중복된 항목 제거
아래 코드처럼 리스트 안에 동일한 항목이 있을때 중복을 제거하는 기능이다.
Dim FirstList As New List(Of String)({"banana", "apple", "banana"})
Dim ResultList As List(Of String) = FirstList.Distinct().ToList()
이렇게 사용하면, ResultList에 중복항목인 "banana"를 하나 없애고, "banana", "apple"의 2개의 항목만 남게 된다. LINQ는 사용할때마다 느끼지만 SQL의 문법을 상당부분 가져다 사용했다. 결국 SQL의 Distinct 구문과 동일하게 동작하게 된다.
이걸 LINQ를 사용하지 않을때는 어쩔수 없이 For문으로 루프를 돌려야 하는데, 이 경우 항목이 많아지게 되면 심각한 성능상의 문제가 발생하니 가능하면 리스트를 사용할때는 LINQ에서 지원하는 기능인지 먼저 확인해보고, 없을 경우 (웬만하면 있다) 어쩔 수 없이 For 루프를 사용하도록 하자.
2. 첫번째 리스트(List1)의 항목중 두번째 리스트(List2)에 있는 항목 제거
이건 위 1번보다 좀더 복잡할 뿐만 아니라 For문을 사용하려면 2중으로 중첩된 For문을 사용해야 해서 리스트 아이템이 수천개 이상일 경우 정말 성능이 급격히 저하되니 무조건 LINQ를 사용하는게 좋다.
Dim List1 As List(Of String)({"banana", "apple", "mango", "cherry"})
Dim List2 As List(Of String)({"apple", "mango", "melon"})
Dim ResultList As List(Of String) = List1.Except(List2).ToList()
정말 간단 단순 명확하기도 하고, 성능도 뛰어나게 빨라지니 무조건 이렇게 사용하도록 연습하자. 리스트가 제공해주는 Except 함수를 사용해서 서로다른 2개의 리스트에서의 중복제거를 손쉽게 할 수가 있다.
결과는 List1에서 List2에 있는 "apple", "mango"를 제거하고 "banana", "cherry" 두개만 ResultList에 넣게 된다.
3. 특정 구조체형일 경우 중복 제거
두개의 리스트가 모두 String형이면 위 2번으로 손쉽게 중복을 제거할 수 있지만, List2가 특정 구조체형이고 그 안에 String이 존재한다면 위 2번과는 다른 접근법이 필요하다.
Structure TEMP_TYPE
Dim intVal As Integer
Dim strVal As String
End Structure
Dim List1 As List(Of String)({"banana", "apple", "mango", "cherry"})
Dim List2 As New List(Of TEMP_TYPE) From {
New TEMP_TYPE With {.intVal = 1, .strVal = "banana"},
New TEMP_TYPE With {.intVal = 2, .strVal = "mango"}
Dim ResultList As List(Of String) = List1.Where(Function(item) Not List2.Any(Function(t) t.strVal = item)).ToList()
여기서도 여전히 LINQ 구문이 사용되고 있는데 Where 함수는 SQL의 Where절과 매우 흡사하다. 이 구문을 이해하려면 LINQ의 문법에 대해 좀더 심도깊은 이해가 필요하니, 다음 기회에 LINQ에 대해 좀더 자세히 알아보는 시간을 마련하도록 하겠다.
마치며...
이번 시간에는 간략한 3개의 예제를 이용해서 리스트의 LINQ 구문에 대해 살펴봤다. LINQ 문법은 상상 그 이상으로 많은 기능을 제공해주니, 위에 잠깐 언급했듯이 리스트의 모든 항목에 영향을 미치는 루프를 돌릴 일이 있으면, 우선 LINQ에서 해당 기능을 지원하는지 확인해보는 습관을 먼저 들이도록 하자.
Where절을 사용할 수 있으니 정렬같은 기능도 손쉽게 구현이 가능하고, 정렬은 아래 링크를 참고하면 된다.
'VB.NET' 카테고리의 다른 글
VB.NET 픽처박스에 움직이는 GIF 재생하기 (0) | 2022.12.23 |
---|---|
VB.NET에서의 Continue For (0) | 2022.12.15 |
VB.NET WPF Timer 사용하기 (0) | 2022.12.10 |
VB.NET에서 컨트롤 배열 만들기 (0) | 2022.12.09 |
WinHTTP로 패킷을 요리하자. (0) | 2022.12.08 |