Enumerable.Distinct 메서드
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
시퀀스의 고유 요소를 반환합니다.
오버로드
Distinct<TSource>(IEnumerable<TSource>, IEqualityComparer<TSource>) |
지정된 IEqualityComparer<T>로 값을 비교하여 시퀀스에서 고유 요소를 반환합니다. |
Distinct<TSource>(IEnumerable<TSource>) |
기본 같음 비교자로 값을 비교하여 시퀀스에서 고유 요소를 반환합니다. |
설명
결과 시퀀스의 순서가 지정되지 않습니다.
Distinct<TSource>(IEnumerable<TSource>, IEqualityComparer<TSource>)
- Source:
- Distinct.cs
- Source:
- Distinct.cs
- Source:
- Distinct.cs
지정된 IEqualityComparer<T>로 값을 비교하여 시퀀스에서 고유 요소를 반환합니다.
public:
generic <typename TSource>
[System::Runtime::CompilerServices::Extension]
static System::Collections::Generic::IEnumerable<TSource> ^ Distinct(System::Collections::Generic::IEnumerable<TSource> ^ source, System::Collections::Generic::IEqualityComparer<TSource> ^ comparer);
public static System.Collections.Generic.IEnumerable<TSource> Distinct<TSource> (this System.Collections.Generic.IEnumerable<TSource> source, System.Collections.Generic.IEqualityComparer<TSource> comparer);
public static System.Collections.Generic.IEnumerable<TSource> Distinct<TSource> (this System.Collections.Generic.IEnumerable<TSource> source, System.Collections.Generic.IEqualityComparer<TSource>? comparer);
static member Distinct : seq<'Source> * System.Collections.Generic.IEqualityComparer<'Source> -> seq<'Source>
<Extension()>
Public Function Distinct(Of TSource) (source As IEnumerable(Of TSource), comparer As IEqualityComparer(Of TSource)) As IEnumerable(Of TSource)
형식 매개 변수
- TSource
source
요소의 형식입니다.
매개 변수
- source
- IEnumerable<TSource>
중복 요소를 제거할 시퀀스입니다.
- comparer
- IEqualityComparer<TSource>
값을 비교할 IEqualityComparer<T>입니다.
반환
소스 시퀀스의 고유 요소가 들어 있는 IEnumerable<T>입니다.
예외
source
이(가) null
인 경우
예제
다음 예제에서는 메서드에서 사용할 Distinct 수 있는 같음 비교자를 구현하는 방법을 보여 줍니다.
public class Product
{
public string Name { get; set; }
public int Code { get; set; }
}
// Custom comparer for the Product class
class ProductComparer : IEqualityComparer<Product>
{
// Products are equal if their names and product numbers are equal.
public bool Equals(Product x, Product y)
{
//Check whether the compared objects reference the same data.
if (Object.ReferenceEquals(x, y)) return true;
//Check whether any of the compared objects is null.
if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
return false;
//Check whether the products' properties are equal.
return x.Code == y.Code && x.Name == y.Name;
}
// If Equals() returns true for a pair of objects
// then GetHashCode() must return the same value for these objects.
public int GetHashCode(Product product)
{
//Check whether the object is null
if (Object.ReferenceEquals(product, null)) return 0;
//Get hash code for the Name field if it is not null.
int hashProductName = product.Name == null ? 0 : product.Name.GetHashCode();
//Get hash code for the Code field.
int hashProductCode = product.Code.GetHashCode();
//Calculate the hash code for the product.
return hashProductName ^ hashProductCode;
}
}
Public Class Product
Public Property Name As String
Public Property Code As Integer
End Class
' Custom comparer for the Product class
Public Class ProductComparer
Implements IEqualityComparer(Of Product)
Public Function Equals1(
ByVal x As Product,
ByVal y As Product
) As Boolean Implements IEqualityComparer(Of Product).Equals
' Check whether the compared objects reference the same data.
If x Is y Then Return True
'Check whether any of the compared objects is null.
If x Is Nothing OrElse y Is Nothing Then Return False
' Check whether the products' properties are equal.
Return (x.Code = y.Code) AndAlso (x.Name = y.Name)
End Function
Public Function GetHashCode1(
ByVal product As Product
) As Integer Implements IEqualityComparer(Of Product).GetHashCode
' Check whether the object is null.
If product Is Nothing Then Return 0
' Get hash code for the Name field if it is not null.
Dim hashProductName =
If(product.Name Is Nothing, 0, product.Name.GetHashCode())
' Get hash code for the Code field.
Dim hashProductCode = product.Code.GetHashCode()
' Calculate the hash code for the product.
Return hashProductName Xor hashProductCode
End Function
End Class
이 비교자를 구현한 후에는 다음 예제와 같이 메서드에서 Distinct 개체 시 Product
퀀스를 사용할 수 있습니다.
Product[] products = { new Product { Name = "apple", Code = 9 },
new Product { Name = "orange", Code = 4 },
new Product { Name = "apple", Code = 9 },
new Product { Name = "lemon", Code = 12 } };
// Exclude duplicates.
IEnumerable<Product> noduplicates =
products.Distinct(new ProductComparer());
foreach (var product in noduplicates)
Console.WriteLine(product.Name + " " + product.Code);
/*
This code produces the following output:
apple 9
orange 4
lemon 12
*/
Dim products() As Product =
{New Product With {.Name = "apple", .Code = 9},
New Product With {.Name = "orange", .Code = 4},
New Product With {.Name = "apple", .Code = 9},
New Product With {.Name = "lemon", .Code = 12}}
' Exclude duplicates.
Dim noduplicates = products.Distinct(New ProductComparer())
For Each product In noduplicates
Console.WriteLine(product.Name & " " & product.Code)
Next
' This code produces the following output:
'
' apple 9
' orange 4
' lemon 12
'
설명
이 메서드는 지연 된 실행을 사용 하 여 구현 됩니다. 즉시 반환 값은 작업을 수행 하는 데 필요한 모든 정보를 저장 하는 개체입니다. 이 메서드가 나타내는 쿼리는 개체를 직접 호출 GetEnumerator
하거나 C# 또는 For Each
Visual Basic에서 를 사용하여 foreach
개체를 열거할 때까지 실행되지 않습니다.
메서드는 Distinct<TSource>(IEnumerable<TSource>, IEqualityComparer<TSource>) 중복 값이 없는 순서가 지정되지 않은 시퀀스를 반환합니다. 가 이null
면 comparer
기본 같음 비교자인 Default가 값을 비교하는 데 사용됩니다.
적용 대상
Distinct<TSource>(IEnumerable<TSource>)
- Source:
- Distinct.cs
- Source:
- Distinct.cs
- Source:
- Distinct.cs
기본 같음 비교자로 값을 비교하여 시퀀스에서 고유 요소를 반환합니다.
public:
generic <typename TSource>
[System::Runtime::CompilerServices::Extension]
static System::Collections::Generic::IEnumerable<TSource> ^ Distinct(System::Collections::Generic::IEnumerable<TSource> ^ source);
public static System.Collections.Generic.IEnumerable<TSource> Distinct<TSource> (this System.Collections.Generic.IEnumerable<TSource> source);
static member Distinct : seq<'Source> -> seq<'Source>
<Extension()>
Public Function Distinct(Of TSource) (source As IEnumerable(Of TSource)) As IEnumerable(Of TSource)
형식 매개 변수
- TSource
source
요소의 형식입니다.
매개 변수
- source
- IEnumerable<TSource>
중복 요소를 제거할 시퀀스입니다.
반환
소스 시퀀스의 고유 요소가 들어 있는 IEnumerable<T>입니다.
예외
source
이(가) null
인 경우
예제
다음 코드 예제에서는 를 사용하여 Distinct<TSource>(IEnumerable<TSource>) 정수 시퀀스에서 고유 요소를 반환하는 방법을 보여 줍니다.
List<int> ages = new List<int> { 21, 46, 46, 55, 17, 21, 55, 55 };
IEnumerable<int> distinctAges = ages.Distinct();
Console.WriteLine("Distinct ages:");
foreach (int age in distinctAges)
{
Console.WriteLine(age);
}
/*
This code produces the following output:
Distinct ages:
21
46
55
17
*/
' Create a list of integers.
Dim ages As New List(Of Integer)(New Integer() _
{21, 46, 46, 55, 17, 21, 55, 55})
' Select the unique numbers in the List.
Dim distinctAges As IEnumerable(Of Integer) = ages.Distinct()
Dim output As New System.Text.StringBuilder("Distinct ages:" & vbCrLf)
For Each age As Integer In distinctAges
output.AppendLine(age)
Next
' Display the output.
Console.WriteLine(output.ToString)
' This code produces the following output:
'
' Distinct ages:
' 21
' 46
' 55
' 17
일부 사용자 지정 데이터 형식의 개체 시퀀스에서 고유 요소를 반환하려면 클래스에서 제네릭 인터페이스를 IEquatable<T> 구현해야 합니다. 다음 코드 예제에서는 사용자 지정 데이터 형식에서이 인터페이스를 구현 하 고 제공 하 고 Equals 메서드를 보여 GetHashCode 줍니다.
public class MyProduct : IEquatable<MyProduct>
{
public string Name { get; set; }
public int Code { get; set; }
public bool Equals(MyProduct other)
{
//Check whether the compared object is null.
if (Object.ReferenceEquals(other, null)) return false;
//Check whether the compared object references the same data.
if (Object.ReferenceEquals(this, other)) return true;
//Check whether the products' properties are equal.
return Code.Equals(other.Code) && Name.Equals(other.Name);
}
// If Equals() returns true for a pair of objects
// then GetHashCode() must return the same value for these objects.
public override int GetHashCode()
{
//Get hash code for the Name field if it is not null.
int hashProductName = Name == null ? 0 : Name.GetHashCode();
//Get hash code for the Code field.
int hashProductCode = Code.GetHashCode();
//Calculate the hash code for the product.
return hashProductName ^ hashProductCode;
}
}
Public Class Product
Implements IEquatable(Of Product)
Public Property Name As String
Public Property Code As Integer
Public Function Equals1(
ByVal other As Product
) As Boolean Implements IEquatable(Of Product).Equals
' Check whether the compared object is null.
If other Is Nothing Then Return False
' Check whether the compared object references the same data.
If Me Is Other Then Return True
' Check whether the products' properties are equal.
Return Code.Equals(other.Code) AndAlso Name.Equals(other.Name)
End Function
Public Overrides Function GetHashCode() As Integer
' Get hash code for the Name field if it is not null.
Dim hashProductName = If(Name Is Nothing, 0, Name.GetHashCode())
' Get hash code for the Code field.
Dim hashProductCode = Code.GetHashCode()
' Calculate the hash code for the product.
Return hashProductName Xor hashProductCode
End Function
End Class
이 인터페이스를 구현한 후에는 다음 예제와 같이 메서드에서 Distinct<TSource>(IEnumerable<TSource>) 개체 시 Product
퀀스를 사용할 수 있습니다.
MyProduct[] products = { new MyProduct { Name = "apple", Code = 9 },
new MyProduct { Name = "orange", Code = 4 },
new MyProduct { Name = "apple", Code = 9 },
new MyProduct { Name = "lemon", Code = 12 } };
// Exclude duplicates.
IEnumerable<MyProduct> noduplicates =
products.Distinct();
foreach (var product in noduplicates)
Console.WriteLine(product.Name + " " + product.Code);
/*
This code produces the following output:
apple 9
orange 4
lemon 12
*/
Dim products() As Product =
{New Product With {.Name = "apple", .Code = 9},
New Product With {.Name = "orange", .Code = 4},
New Product With {.Name = "apple", .Code = 9},
New Product With {.Name = "lemon", .Code = 12}}
' Exclude duplicates.
Dim noduplicates = products.Distinct()
For Each product In noduplicates
Console.WriteLine(product.Name & " " & product.Code)
Next
' This code produces the following output:
'
' apple 9
' orange 4
' lemon 12
'
설명
이 메서드는 지연 된 실행을 사용 하 여 구현 됩니다. 즉시 반환 값은 작업을 수행 하는 데 필요한 모든 정보를 저장 하는 개체입니다. 이 메서드가 나타내는 쿼리는 개체를 직접 호출 GetEnumerator
하거나 C# 또는 For Each
Visual Basic에서 를 사용하여 foreach
개체를 열거할 때까지 실행되지 않습니다.
메서드는 Distinct<TSource>(IEnumerable<TSource>) 중복 값이 없는 순서가 지정되지 않은 시퀀스를 반환합니다. 기본 같음 비교자 를 Default사용하여 값을 비교합니다.
Visual Basic 쿼리 식 구문에서 절은 Distinct
호출로 Distinct변환됩니다.
기본 같음 비교자 는 Default제네릭 인터페이스를 구현 IEquatable<T> 하는 형식의 값을 비교하는 데 사용됩니다. 사용자 지정 데이터 형식을 비교하려면 이 인터페이스를 구현하고 형식에 대한 고유한 GetHashCode 및 Equals 메서드를 제공해야 합니다.
를 사용하여 IEqualityComparer<T> 사용자 지정 비교자를 정의하는 예제는 를 참조하세요 Distinct<TSource>(IEnumerable<TSource>, IEqualityComparer<TSource>).
추가 정보
적용 대상
.NET