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ślonego 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>, który zawiera różne elementy z sekwencji źródłowej.An IEnumerable<T> that contains distinct elements from the source sequence.

Wyjątki

Parametr source ma wartość null.source is null.

Przykłady

Poniższy przykład kodu demonstruje sposób użycia Distinct<TSource>(IEnumerable<TSource>), aby zwracać różne elementy 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ć interfejs IEquatable<T> generycznego 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ć metody GetHashCode i Equals.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 metodzie Distinct<TSource>(IEnumerable<TSource>), 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 metody GetEnumerator bezpośrednio lub przy użyciu foreach w wizualizacji 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.

Metoda Distinct<TSource>(IEnumerable<TSource>) 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, do porównywania wartości.It uses the default equality comparer, Default, to compare values.

W Visual Basic składni wyrażenia zapytania, klauzula Distinct 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, służy 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 zapewnić własne GetHashCode i 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 uzyskać przykład, 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ż

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

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

Zwraca

IEnumerable<TSource>

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

Wyjątki

Parametr source ma wartość null.source is null.

Przykłady

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

Po zaimplementowaniu tej metody porównującej można użyć sekwencji Product obiektów w metodzie Distinct, 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 metody GetEnumerator bezpośrednio lub przy użyciu foreach w wizualizacji 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.

Metoda Distinct<TSource>(IEnumerable<TSource>, IEqualityComparer<TSource>) 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ść, Defaultjest używana do porównywania wartości.If comparer is null, the default equality comparer, Default, is used to compare values.

Dotyczy