Enumerable.Distinct Metódus

Definíció

Különböző elemeket ad vissza egy sorozatból.

Túlterhelések

Name Description
Distinct<TSource>(IEnumerable<TSource>)

Az értékek összehasonlításához az alapértelmezett egyenlőség-összehasonlítóval különböző elemeket ad vissza egy sorozatból.

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

Különböző elemeket ad vissza egy sorozatból egy megadott IEqualityComparer<T> érték összehasonlítása gombra kattintva.

Megjegyzések

Az eredményütemezés rendezetlen.

Distinct<TSource>(IEnumerable<TSource>)

Az értékek összehasonlításához az alapértelmezett egyenlőség-összehasonlítóval különböző elemeket ad vissza egy sorozatból.

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)

Típusparaméterek

TSource

A . elemeinek sourcetípusa.

Paraméterek

source
IEnumerable<TSource>

Az ismétlődő elemek eltávolítására vonatkozó sorozat.

Válaszok

IEnumerable<TSource>

Olyan IEnumerable<T> elem, amely a forrásütemezéstől eltérő elemeket tartalmaz.

Kivételek

source az null.

Példák

Az alábbi példakód bemutatja, hogyan lehet Distinct<TSource>(IEnumerable<TSource>) különböző elemeket visszaadni egész számok sorozatából.

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

Ha különböző elemeket szeretne visszaadni bizonyos egyéni adattípusú objektumok sorozataitól, az általános felületet kell implementálnia IEquatable<T> az osztályban. Az alábbi példakód bemutatja, hogyan implementálhatja ezt a felületet egy egyéni adattípusban, és hogyan biztosíthatja és Equals metódusokkal.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

A felület implementálása után objektumsorozatot Product használhat a Distinct<TSource>(IEnumerable<TSource>) metódusban, ahogyan az a következő példában látható:

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
'

Megjegyzések

Ezt a metódust halasztott végrehajtással implementáljuk. Az azonnali visszatérési érték egy objektum, amely a művelet végrehajtásához szükséges összes információt tárolja. A metódus által képviselt lekérdezés csak akkor lesz végrehajtva, ha az objektumot a GetEnumerator metódus közvetlen meghívásával vagy foreach c# vagy For Each használatával Visual Basic.

A Distinct<TSource>(IEnumerable<TSource>) metódus egy rendezetlen sorozatot ad vissza, amely nem tartalmaz ismétlődő értékeket. Az alapértelmezett egyenlőség-összehasonlítót használja az Defaultértékek összehasonlításához.

A Visual Basic lekérdezési kifejezés szintaxisában egy Distinct záradék Distinct meghívására fordít.

Az alapértelmezett egyenlőség-összehasonlító az Defaultáltalános felületet megvalósító típusok értékeinek összehasonlítására IEquatable<T> szolgál. Az egyéni adattípusok összehasonlításához implementálnia kell ezt az interfészt, és meg kell adnia a saját GetHashCode és Equals a típushoz tartozó metódusokat.

Az egyéni összehasonlító definiálásához használt IEqualityComparer<T> példát lásd Distinct<TSource>(IEnumerable<TSource>, IEqualityComparer<TSource>): .

Lásd még

A következőre érvényes:

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

Különböző elemeket ad vissza egy sorozatból egy megadott IEqualityComparer<T> érték összehasonlítása gombra kattintva.

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)

Típusparaméterek

TSource

A . elemeinek sourcetípusa.

Paraméterek

source
IEnumerable<TSource>

Az ismétlődő elemek eltávolítására vonatkozó sorozat.

comparer
IEqualityComparer<TSource>

Egy IEqualityComparer<T> érték összehasonlítása.

Válaszok

IEnumerable<TSource>

Olyan IEnumerable<T> elem, amely a forrásütemezéstől eltérő elemeket tartalmaz.

Kivételek

source az null.

Példák

Az alábbi példa bemutatja, hogyan valósítható meg a metódusban Distinct használható egyenlőség-összehasonlító.

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

A összehasonlító implementálása után objektumsorozatot Product használhat a Distinct metódusban, ahogyan az a következő példában látható:

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
'

Megjegyzések

Ezt a metódust halasztott végrehajtással implementáljuk. Az azonnali visszatérési érték egy objektum, amely a művelet végrehajtásához szükséges összes információt tárolja. A metódus által képviselt lekérdezés csak akkor lesz végrehajtva, ha az objektumot a GetEnumerator metódus közvetlen meghívásával vagy foreach c# vagy For Each használatával Visual Basic.

A Distinct<TSource>(IEnumerable<TSource>, IEqualityComparer<TSource>) metódus egy rendezetlen sorozatot ad vissza, amely nem tartalmaz ismétlődő értékeket. Ha comparer igen null, akkor az alapértelmezett egyenlőség-összehasonlító Defaultaz értékek összehasonlítására szolgál.

A következőre érvényes: