본문 바로가기
C#

C# 리스트 중복 제거 방법 – Distinct와 LINQ 예제

by 코딩이라구 2025. 5. 13.

C#에서 리스트를 사용할 때 중복 데이터를 제거하는 상황은 매우 흔하게 발생합니다. 이때 LINQ의 Distinct() 함수를 활용하면 간단하게 중복을 제거하고 고유한 값만 추출할 수 있습니다. 이 글에서는 Distinct() 함수의 사용법부터 LINQ로 복합 객체의 중복을 제거하는 방법까지 예제 중심으로 정리해보겠습니다.

C# 리스트 중복 제거 방법 – Distinct와 LINQ 예제
C# 리스트 중복 제거 방법 – 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

 

댓글