Enumerable.Distinct Metoda

Definicja

Zwraca różne elementy z sekwencji.Returns distinct elements from a sequence.

Przeciążenia

Distinct<TSource>(IEnumerable<TSource>)

Zwraca różne elementy z sekwencji przy użyciu domyślnej funkcji porównującej równość do porównywania wartości.Returns distinct elements from a sequence by using the default equality comparer to compare values.

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

Zwraca różne elementy z sekwencji przy użyciu określonej IEqualityComparer<T> do porównywania wartości.Returns distinct elements from a sequence by using a specified IEqualityComparer<T> to compare values.

Uwagi

Sekwencja wyników jest nieuporządkowana.The result sequence is unordered.

Distinct<TSource>(IEnumerable<TSource>)

Zwraca różne elementy z sekwencji przy użyciu domyślnej funkcji porównującej równość do porównywania wartości.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)

Parametry typu

TSource

Typ elementów source .The type of the elements of source.

Parametry

source
IEnumerable<TSource>

Sekwencja, z której mają zostać usunięte zduplikowane elementy.The sequence to remove duplicate elements from.

Zwraca

IEnumerable<TSource>

IEnumerable<T>Zawiera różne elementy z sekwencji źródłowej.An IEnumerable<T> that contains distinct elements from the source sequence.

Wyjątki

source to null.source is null.

Przykłady

Poniższy przykład kodu demonstruje, jak używać Distinct<TSource>(IEnumerable<TSource>) do zwracania odrębnych elementów z sekwencji liczb całkowitych.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.
Console.WriteLine(output.ToString)

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

Jeśli chcesz zwrócić różne elementy z sekwencji obiektów pewnego niestandardowego typu danych, musisz zaimplementować IEquatable<T> interfejs generyczny w klasie.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. Poniższy przykład kodu pokazuje, jak zaimplementować ten interfejs w niestandardowym typie danych i zapewnić GetHashCode Equals metody i.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

Po zaimplementowaniu tego interfejsu można użyć sekwencji Product obiektów w Distinct<TSource>(IEnumerable<TSource>) metodzie, jak pokazano w następującym przykładzie: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
' 

Uwagi

Ta metoda jest implementowana za pomocą odroczonego wykonania.This method is implemented by using deferred execution. Bezpośrednio zwracana wartość jest obiektem, który przechowuje wszystkie informacje wymagane do wykonania akcji.The immediate return value is an object that stores all the information that is required to perform the action. Zapytanie reprezentowane przez tę metodę nie jest wykonywane do momentu wyliczenia obiektu przez wywołanie jego GetEnumerator metody bezpośrednio lub przy użyciu foreach w Visual C# lub For Each w 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>)Metoda zwraca sekwencję nieuporządkowaną, która nie zawiera zduplikowanych wartości.The Distinct<TSource>(IEnumerable<TSource>) method returns an unordered sequence that contains no duplicate values. Używa domyślnej opcji porównującej równość, Default Aby porównać wartości.It uses the default equality comparer, Default, to compare values.

W Visual Basic składni wyrażenia zapytania, Distinct klauzula tłumaczy na wywołanie Distinct .In Visual Basic query expression syntax, a Distinct clause translates to an invocation of Distinct.

Domyślna funkcja porównująca równość Default jest używana do porównywania wartości typów, które implementują IEquatable<T> interfejs ogólny.The default equality comparer, Default, is used to compare values of the types that implement the IEquatable<T> generic interface. Aby porównać niestandardowy typ danych, należy zaimplementować ten interfejs i udostępnić własne GetHashCode Equals metody dla typu.To compare a custom data type, you need to implement this interface and provide your own GetHashCode and Equals methods for the type.

Aby zapoznać się z przykładem, który używa IEqualityComparer<T> do definiowania niestandardowego modułu porównującego, zobacz 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>).

Zobacz też

Dotyczy

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

Zwraca różne elementy z sekwencji przy użyciu określonej IEqualityComparer<T> do porównywania wartości.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);
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)

Parametry typu

TSource

Typ elementów source .The type of the elements of source.

Parametry

source
IEnumerable<TSource>

Sekwencja, z której mają zostać usunięte zduplikowane elementy.The sequence to remove duplicate elements from.

comparer
IEqualityComparer<TSource>

IEqualityComparer<T>Do porównywania wartości.An IEqualityComparer<T> to compare values.

Zwraca

IEnumerable<TSource>

IEnumerable<T>Zawiera różne elementy z sekwencji źródłowej.An IEnumerable<T> that contains distinct elements from the source sequence.

Wyjątki

source to null.source is null.

Przykłady

Poniższy przykład pokazuje, jak zaimplementować funkcję porównującą równość, która może zostać użyta w Distinct metodzie.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

Po zaimplementowaniu tej metody porównującej można użyć sekwencji Product obiektów w Distinct metodzie, jak pokazano w następującym przykładzie: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
' 

Uwagi

Ta metoda jest implementowana za pomocą odroczonego wykonania.This method is implemented by using deferred execution. Bezpośrednio zwracana wartość jest obiektem, który przechowuje wszystkie informacje wymagane do wykonania akcji.The immediate return value is an object that stores all the information that is required to perform the action. Zapytanie reprezentowane przez tę metodę nie jest wykonywane do momentu wyliczenia obiektu przez wywołanie jego GetEnumerator metody bezpośrednio lub przy użyciu foreach w Visual C# lub For Each w 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>)Metoda zwraca sekwencję nieuporządkowaną, która nie zawiera zduplikowanych wartości.The Distinct<TSource>(IEnumerable<TSource>, IEqualityComparer<TSource>) method returns an unordered sequence that contains no duplicate values. Jeśli comparer jest null , domyślna funkcja porównująca równość Default jest używana do porównywania wartości.If comparer is null, the default equality comparer, Default, is used to compare values.

Dotyczy