2026년 상식닷컴 선정 식당 & 카페 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요

C#의 LINQ에서 Distinct의 사용법은?

_____
Q1: C 에서 LINQ의 Distinct() 메서드는 무엇인가요?
A1: Distinct() 메서드는 LINQ 쿼리에서 컬렉션 내의 중복된 요소를 제거하고 유일한 요소들만 반환하는 메서드입니다. 기본적으로 요소들의 Equals() 및 GetHashCode() 메서드를 사용하여 중복을 판단합니다.

---

Q2: Distinct() 메서드의 기본 사용법은 어떻게 되나요?
A2: 컬렉션(예: List)에서 중복을 제거하려면 다음과 같이 사용합니다.
```csharp
var numbers = new List { 1, 2, 2, 3, 4, 4, 5 };
var distinctNumbers = numbers.Distinct(); // 결과는 1, 2, 3, 4, 5
```

---

Q3: Distinct()는 어떤 타입에서 사용 가능한가요?
A3: Distinct()는 IEnumerable를 구현하는 모든 컬렉션에서 사용할 수 있습니다. 즉, 배열, 리스트, 집합 등 LINQ를 사용할 수 있는 모든 시퀀스에서 사용할 수 있습니다.

---

Q4: 객체 리스트에서 Distinct()를 사용할 때 주의할 점은 무엇인가요?
A4: 사용자 정의 객체(List 등)에서 Distinct()를 쓰면 기본적으로 객체의 Equals()와 GetHashCode() 구현에 따라 중복 판단이 이루어집니다. 별도의 구현이 없으면 참조 동일성(레퍼런스)를 기준으로 판단하여 원하는 결과가 나오지 않을 수 있습니다.

---

Q5: 사용자 정의 객체에 맞게 Distinct()를 사용하려면 어떻게 해야 하나요?
A5: 두 가지 방법이 있습니다.

1. 해당 클래스에 Equals()와 GetHashCode()를 오버라이드하여 객체 동등성을 정의.
2. IEqualityComparer 인터페이스를 구현한 비교자(Comparer)를 Distinct() 호출 시 인자로 전달.

예시:
```csharp
class Person {
public string Name { get; set; }
public int Age { get; set; }

public override bool Equals(object obj) {
if (obj is Person other)
return Name == other.Name && Age == other.Age;
return false;
}

public override int GetHashCode() {
return (Name, Age).GetHashCode();
}
}

// 또는 IEqualityComparer 구현
class PersonComparer : IEqualityComparer {
public bool Equals(Person x, Person y) {
return x.Name == y.Name && x.Age == y.Age;
}
public int GetHashCode(Person obj) {
return (obj.Name, obj.Age).GetHashCode();
}
}

// 사용법
var distinctPeople = people.Distinct(new PersonComparer());
```

---

Q6: Distinct() 메서드는 원본 컬렉션을 변경하나요?
A6: 아니요. Distinct()는 원본 컬렉션을 변경하지 않고 중복이 제거된 새 시퀀스를 반환합니다.

---

Q7: Distinct() 결과를 리스트로 받고 싶으면 어떻게 해야 하나요?
A7: Distinct() 결과는 IEnumerable 타입이므로 ToList() 등을 사용하여 리스트로 만들 수 있습니다.
```csharp
var distinctList = numbers.Distinct().ToList();
```

---

Q8: Distinct()와 DistinctBy()의 차이점은 무엇인가요?
A8: Distinct()는 완전한 객체 단위로 중복을 제거하지만, DistinctBy()는 특정 키(selector) 기준으로 중복을 제거합니다. DistinctBy()는 .NET 6부터 지원됩니다. 예:
```csharp
var distinctByName = people.DistinctBy(p => p.Name);
```

---

Q9: 중복 제거 시 대소문자를 무시하고 싶을 때 어떻게 하나요?
A9: IEqualityComparer를 구현하거나 내장된 StringComparer.OrdinalIgnoreCase 등을 사용할 수 있습니다. 예:
```csharp
var words = new List { "apple", "Apple", "APPLE" };
var distinctWords = words.Distinct(StringComparer.OrdinalIgnoreCase);
```

---

Q10: Distinct() 내부 동작 원리는 무엇인가요?
A10: Distinct()는 내부적으로 해시 집합(HashSet)을 사용하여 각 요소의 해시 코드를 기준으로 중복을 판단하고 유일한 값만 순차적으로 반환합니다.

---

요약하자면, LINQ의 Distinct()는 중복된 요소를 제거하여 유일한 값만 반환하는 매우 편리한 메서드이며, 사용자 정의 타입에서는 Equals/GetHashCode 오버라이드 또는 IEqualityComparer 구현을 통해 원하는 중복 기준을 정의할 수 있습니다.
C 의 LINQ(언어 통합 쿼리)는 데이터 소스에 대한 쿼리를 작성할 수 있는 강력한 기능을 제공합니다.

LINQ의 다양한 메서드 중 하나인 `Distinct`는 컬렉션에서 중복된 요소를 제거하고 고유한 요소만을 반환하는 데 사용됩니다.

이 메서드는 특히 데이터 집합에서 중복을 처리해야 할 때 유용합니다.

Distinct 메서드의 기본 사용법 `Distinct` 메서드는 `System.Linq` 네임스페이스에 정의되어 있으며, IEnumerable 인터페이스를 구현하는 모든 컬렉션에서 사용할 수 있습니다.

기본적인 사용법은 다음과 같습니다.

```csharp using System; using System.Collections.Generic; using System.Linq; class Program { static void Main() { List numbers = new List { 1, 2, 2, 3, 4, 4, 5 }; IEnumerable distinctNumbers = numbers.Distinct(); foreach (int number in distinctNumbers) { Console.WriteLine(number); } } } ``` 위의 예제에서 `numbers` 리스트에는 중복된 값이 포함되어 있습니다.

`Distinct` 메서드를 호출하면 중복된 값이 제거된 새로운 컬렉션이 반환됩니다.

출력 결과는 다음과 같습니다.

``` 1 2 3 4 5 ``` 사용자 정의 객체에서 Distinct 사용하기 `Distinct` 메서드는 기본 데이터 타입뿐만 아니라 사용자 정의 객체에서도 사용할 수 있습니다.

그러나 이 경우 객체의 동등성을 정의해야 합니다.

기본적으로 `Distinct`는 객체의 참조를 비교하므로, 두 객체가 동일한지 판단하기 위해 `IEquatable` 인터페이스를 구현하거나 `Equals` 및 `GetHashCode` 메서드를 오버라이드해야 합니다.

예를 들어, 다음과 같은 `Person` 클래스를 정의할 수 있습니다.

```csharp public class Person { public string Name { get; set; } public int Age { get; set; } public override bool Equals(object obj) { if (obj is Person other) { return this.Name == other.Name && this.Age == other.Age; } return false; } public override int GetHashCode() { return HashCode.Combine(Name, Age); } } ``` 이제 `Person` 객체의 리스트에서 중복된 요소를 제거할 수 있습니다.

```csharp List people = new List { new Person { Name = "Alice", Age = 30 }, new Person { Name = "Bob", Age = 25 }, new Person { Name = "Alice", Age = 30 }, // 중복 }; IEnumerable distinctPeople = people.Distinct(); foreach (var person in distinctPeople) { Console.WriteLine($"{person.Name}, {person.Age}"); } ``` 위의 코드에서 `Alice`가 두 번 나타나지만, `Distinct` 메서드를 사용하여 중복된 객체를 제거할 수 있습니다.

커스텀 비교자를 사용한 Distinct 사용자 정의 객체의 경우, `IEqualityComparer` 인터페이스를 구현하여 커스텀 비교자를 제공할 수도 있습니다.

이를 통해 `Distinct` 메서드에 사용자 정의 비교 로직을 적용할 수 있습니다.

```csharp public class PersonComparer : IEqualityComparer { public bool Equals(Person x, Person y) { if (x == null || y == null) return false; return x.Name == y.Name && x.Age == y.Age; } public int GetHashCode(Person obj) { return HashCode.Combine(obj.Name, obj.Age); } } // 사용 예 IEnumerable distinctPeopleWithComparer = people.Distinct(new PersonComparer()); ``` 이렇게 하면 `PersonComparer`를 사용하여 `Distinct` 메서드가 중복을 판단하게 됩니다.

요약 C 의 LINQ에서 `Distinct` 메서드는 중복된 요소를 제거하고 고유한 요소만을 반환하는 데 유용한 도구입니다.

기본 데이터 타입뿐만 아니라 사용자 정의 객체에서도 사용할 수 있으며, 이 경우 객체의 동등성을 정의하는 것이 중요합니다.

`IEqualityComparer`를 사용하여 커스텀 비교자를 제공함으로써 더욱 유연한 중복 제거 로직을 구현할 수 있습니다.

LINQ의 `Distinct` 메서드는 데이터 처리 및 쿼리 작성 시 매우 유용한 기능으로, 다양한 상황에서 활용될 수 있습니다.

작성자: 김수호 [비회원] | 작성일자: 1년 전 2024-09-09 08:38:59
조회수: 308 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.