Enumerable.Distinct Enumerable.Distinct Enumerable.Distinct Enumerable.Distinct Method

정의

시퀀스에서 고유 요소를 반환 합니다.Returns distinct elements from a sequence.

오버로드

Distinct<TSource>(IEnumerable<TSource>) Distinct<TSource>(IEnumerable<TSource>) Distinct<TSource>(IEnumerable<TSource>) Distinct<TSource>(IEnumerable<TSource>)

기본 같음 비교자를 사용 하 여 값을 비교 하 여 시퀀스에서 고유 요소를 반환 합니다.Returns distinct elements from a sequence by using the default equality comparer to compare values.

Distinct<TSource>(IEnumerable<TSource>, IEqualityComparer<TSource>) Distinct<TSource>(IEnumerable<TSource>, IEqualityComparer<TSource>) Distinct<TSource>(IEnumerable<TSource>, IEqualityComparer<TSource>) Distinct<TSource>(IEnumerable<TSource>, IEqualityComparer<TSource>)

지정 된 사용 하 여 시퀀스에서 고유 요소를 반환 IEqualityComparer<T> 값을 비교 합니다.Returns distinct elements from a sequence by using a specified IEqualityComparer<T> to compare values.

설명

결과 시퀀스 정렬 아닙니다.The result sequence is unordered.

Distinct<TSource>(IEnumerable<TSource>) Distinct<TSource>(IEnumerable<TSource>) Distinct<TSource>(IEnumerable<TSource>) Distinct<TSource>(IEnumerable<TSource>)

기본 같음 비교자를 사용 하 여 값을 비교 하 여 시퀀스에서 고유 요소를 반환 합니다.Returns distinct elements from a sequence by using the default equality comparer to compare values.

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 요소의 형식입니다.The type of the elements of source.

매개 변수

source
IEnumerable<TSource>

중복 요소를 제거할 시퀀스입니다.The sequence to remove duplicate elements from.

반환

IEnumerable<TSource>

IEnumerable<T> 소스 시퀀스의 고유 요소가 들어 있는입니다.An IEnumerable<T> that contains distinct elements from the source sequence.

예외

예제

다음 코드 예제에 사용 하는 방법을 보여 줍니다. Distinct<TSource>(IEnumerable<TSource>) 정수 시퀀스에서 고유 요소를 반환 합니다.The following code example demonstrates how to use Distinct<TSource>(IEnumerable<TSource>) to return distinct elements from a sequence of integers.

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.
MsgBox(output.ToString)

' This code produces the following output:
'
' Distinct ages:
' 21
' 46
' 55
' 17

구현 해야 하는 일부 사용자 지정 데이터 형식 개체의 시퀀스에서 고유 요소를 반환 하려는 경우는 IEquatable<T> 클래스에 제네릭 인터페이스입니다.If you want to return distinct elements from sequences of objects of some custom data type, you have to implement the IEquatable<T> generic interface in the class. 다음 코드 예제에서는 사용자 지정 데이터 형식에서이 인터페이스를 구현 하 고 제공 하는 방법을 보여 줍니다 GetHashCodeEquals 메서드.The following code example shows how to implement this interface in a custom data type and provide GetHashCode and Equals methods.

public class Product : IEquatable<Product>
{
    public string Name { get; set; }
    public int Code { get; set; }

    public bool Equals(Product 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

이 인터페이스를 구현한 후의 시퀀스를 사용할 수 있습니다 Product 개체는 Distinct<TSource>(IEnumerable<TSource>) 메서드를 다음 예제에서와 같이:After you implement this interface, you can use a sequence of Product objects in the Distinct<TSource>(IEnumerable<TSource>) method, as shown in the following example:

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();

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
' 

설명

이 메서드는 지연 된 실행을 사용 하 여 구현 됩니다.This method is implemented by using deferred execution. 즉시 반환 값은 작업을 수행 하는 데 필요한 모든 정보를 저장 하는 개체입니다.The immediate return value is an object that stores all the information that is required to perform the action. 이 메서드를 나타내는 쿼리 하거나 호출 하 여 개체 열거 될 때까지 실행 되지 않습니다 해당 GetEnumerator 메서드를 사용 하 여 직접 또는 foreach Visual C# 또는 For Each Visual Basic의 합니다.The query represented by this method is not executed until the object is enumerated either by calling its GetEnumerator method directly or by using foreach in Visual C# or For Each in Visual Basic.

Distinct<TSource>(IEnumerable<TSource>) 메서드가 중복 값을 포함 하는 순서가 지정 되지 않은 시퀀스를 반환 합니다.The Distinct<TSource>(IEnumerable<TSource>) method returns an unordered sequence that contains no duplicate values. 기본 같음 비교자를 사용 하 여 Default, 값을 비교 합니다.It uses the default equality comparer, Default, to compare values.

Visual Basic 쿼리 식 구문에는 Distinct 절 뒤에 변환 Distinct합니다.In Visual Basic query expression syntax, a Distinct clause translates to an invocation of Distinct.

기본 같음 비교자 Default를 구현 하는 형식의 값을 비교 하는 데 사용 되는 IEquatable<T> 제네릭 인터페이스.The default equality comparer, Default, is used to compare values of the types that implement the IEquatable<T> generic interface. 사용자 지정 데이터 형식을 비교 하려면이 인터페이스를 구현 하 고 제공 고유한 GetHashCodeEquals 메서드 형식에 대 한 합니다.To compare a custom data type, you need to implement this interface and provide your own GetHashCode and Equals methods for the type.

사용 하는 예로 IEqualityComparer<T> 사용자 지정 비교자를 정의 하려면 참조 Distinct<TSource>(IEnumerable<TSource>, IEqualityComparer<TSource>)합니다.For an example that uses IEqualityComparer<T> to define a custom comparer, see Distinct<TSource>(IEnumerable<TSource>, IEqualityComparer<TSource>).

추가 정보

Distinct<TSource>(IEnumerable<TSource>, IEqualityComparer<TSource>) Distinct<TSource>(IEnumerable<TSource>, IEqualityComparer<TSource>) Distinct<TSource>(IEnumerable<TSource>, IEqualityComparer<TSource>) Distinct<TSource>(IEnumerable<TSource>, IEqualityComparer<TSource>)

지정 된 사용 하 여 시퀀스에서 고유 요소를 반환 IEqualityComparer<T> 값을 비교 합니다.Returns distinct elements from a sequence by using a specified IEqualityComparer<T> to compare values.

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);
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 요소의 형식입니다.The type of the elements of source.

매개 변수

source
IEnumerable<TSource>

중복 요소를 제거할 시퀀스입니다.The sequence to remove duplicate elements from.

comparer
IEqualityComparer<TSource>

IEqualityComparer<T> 값을 비교 합니다.An IEqualityComparer<T> to compare values.

반환

IEnumerable<TSource>

IEnumerable<T> 소스 시퀀스의 고유 요소가 들어 있는입니다.An IEnumerable<T> that contains distinct elements from the source sequence.

예외

예제

다음 예제에서는에서 사용할 수 있는 같음 비교자를 구현 하는 방법을 보여 줍니다는 Distinct 메서드.The following example shows how to implement an equality comparer that can be used in the Distinct method.

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

이 비교자를 구현한 후의 시퀀스를 사용할 수 있습니다 Product 개체는 Distinct 메서드를 다음 예제에서와 같이:After you implement this comparer, you can use a sequence of Product objects in the Distinct method, as shown in the following example:

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
' 

설명

이 메서드는 지연 된 실행을 사용 하 여 구현 됩니다.This method is implemented by using deferred execution. 즉시 반환 값은 작업을 수행 하는 데 필요한 모든 정보를 저장 하는 개체입니다.The immediate return value is an object that stores all the information that is required to perform the action. 이 메서드를 나타내는 쿼리 하거나 호출 하 여 개체 열거 될 때까지 실행 되지 않습니다 해당 GetEnumerator 메서드를 사용 하 여 직접 또는 foreach Visual C# 또는 For Each Visual Basic의 합니다.The query represented by this method is not executed until the object is enumerated either by calling its GetEnumerator method directly or by using foreach in Visual C# or For Each in Visual Basic.

Distinct<TSource>(IEnumerable<TSource>, IEqualityComparer<TSource>) 메서드가 중복 값을 포함 하는 순서가 지정 되지 않은 시퀀스를 반환 합니다.The Distinct<TSource>(IEnumerable<TSource>, IEqualityComparer<TSource>) method returns an unordered sequence that contains no duplicate values. 하는 경우 comparer 됩니다 null, 기본 같음 비교자를 Default, 값을 비교 하는 데 사용 됩니다.If comparer is null, the default equality comparer, Default, is used to compare values.

적용 대상