C#에서 리스트를 사용할 때 중복 데이터를 제거하는 상황은 매우 흔하게 발생합니다. 이때 LINQ의 Distinct() 함수를 활용하면 간단하게 중복을 제거하고 고유한 값만 추출할 수 있습니다. 이 글에서는 Distinct() 함수의 사용법부터 LINQ로 복합 객체의 중복을 제거하는 방법까지 예제 중심으로 정리해보겠습니다.
C# 문자열을 숫자로 변환하는 방법 (ToString, Parse, Convert 비교) →
C# 리스트 중복 요소 제거 - DISTINCT, LINQ
1. Distinct() – 기본 데이터형 중복 제거
- 리스트에서 중복을 제거할 때는 Distinct 함수를 사용합니다. 이때 반환되는 값으로는 Enumerable 요소들을 반환하고, ToList()를 통하여 리스트로 변환하실 수 있습니다.
- list.Distinct().ToList();
// 문자열 리스트에서 중복 제거 예제
List<string> names = new List<string>
{
"홍길동", "김영희", "홍길동", "이철수"
};
List<string> distinctNames = names.Distinct().ToList();
foreach (string name in distinctNames)
{
Console.WriteLine(name);
}
✅ 결과
홍길동
김영희
이철수
Distinct() 함수는 IEnumerable<T>를 반환하므로 .ToList()를 통해 다시 리스트로 변환할 수 있습니다. 단, string, int, bool 등 기본 데이터형에만 기본적으로 잘 동작합니다.
2. LINQ + Distinct() – 사용자 정의 객체 중복 제거
Distinct()는 기본적으로 객체 비교 시 참조 기준으로 동작하기 때문에, 사용자 정의 객체에 적용할 경우에는 별도의 비교 로직을 제공해야 합니다.
// 사용자 정의 클래스
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
// 동등 비교를 위한 Equals(), GetHashCode() 오버라이드 필요
public override bool Equals(object obj)
{
if (obj is not Person p) return false;
return Name == p.Name && Age == p.Age;
}
public override int GetHashCode()
{
return HashCode.Combine(Name, Age);
}
}
// 리스트 생성 및 중복 제거
List<Person> people = new List<Person>
{
new Person { Name = "홍길동", Age = 30 },
new Person { Name = "김영희", Age = 25 },
new Person { Name = "홍길동", Age = 30 },
new Person { Name = "박철수", Age = 28 }
};
List<Person> distinctPeople = people.Distinct().ToList();
foreach (var person in distinctPeople)
{
Console.WriteLine($"이름: {person.Name}, 나이: {person.Age}");
}
✅ 결과
이름: 홍길동, 나이: 30
이름: 김영희, 나이: 25
이름: 박철수, 나이: 28
🎯 사용자 정의 객체에서는 Distinct()를 제대로 작동시키려면 Equals()와 GetHashCode()를 꼭 구현해야 합니다.
3. IEqualityComparer 인터페이스로 중복 조건 커스터마이징
Equals/GetHashCode 오버라이드 없이도 특정 기준으로 중복 제거하려면 IEqualityComparer<T>를 사용할 수 있습니다.
// 특정 필드(Name)만으로 중복 판단하기 위한 Comparer
public class PersonNameComparer : IEqualityComparer<Person>
{
public bool Equals(Person x, Person y)
{
return x.Name == y.Name;
}
public int GetHashCode(Person obj)
{
return obj.Name.GetHashCode();
}
}
var distinctByName = people.Distinct(new PersonNameComparer()).ToList();
✔️ 실사용시에는 중복 조건이 바뀔 수 있으므로 이 방식이 유연하고 유지보수에 유리합니다.
✅ 요약
- 기본 타입은 Distinct() + .ToList()로 간단하게 중복 제거 가능
- 사용자 정의 클래스는 Equals() + GetHashCode() 구현 필요
- 특정 속성 기준 비교는 IEqualityComparer<T> 사용 추천
이 글이 도움이 되셨다면 다음 글도 확인해보세요:
C# 리스트에서 조건에 맞는 항목 필터링 – Where() 함수 →
C#에서 문자열 포맷 지정하는 방법 – String.Format 사용법 →
이번에는 C#에서 리스트에서 중복 요소를 제거하는 Distinct(), LINQ 두 가지 방법에 대하여 알아보았습니다. 복합 객체의 중복 제거에 어려움을 느끼셨다면, LINQ를 활용한 방법이 큰 도움이 될 것입니다.
MSDN 참고 자료 - https://learn.microsoft.com/en-us/dotnet/api/system.linq.enumerable.distinct?view=net-7.0
Enumerable.Distinct Method (System.Linq)
Returns distinct elements from a sequence.
learn.microsoft.com
'C#' 카테고리의 다른 글
C# double to string 변환 – 실수 소수점 자릿수 지정 방법 정리 (0) | 2025.05.14 |
---|---|
C# int.Parse() 사용 시 발생하는 예외와 해결 방법 (FormatException, OverflowException) (0) | 2025.03.20 |
C#에서 String을 Int로 변환하는 4가지 방법 (TryParse, Parse, Convert, System.Globalization) (0) | 2025.03.20 |
C# LINQ에서 Where 조건문 여러 개 사용하기: 효율적인 필터링 방법 (0) | 2025.03.07 |
[C#] double to int 형변환 (0) | 2023.01.13 |
댓글