Enumerable.Distinct 方法

定義

回傳序列中不同的元素。

多載

名稱 Description
Distinct<TSource>(IEnumerable<TSource>, IEqualityComparer<TSource>)

使用指定的 IEqualityComparer<T> 來比較值,從序列傳回不同的專案。

Distinct<TSource>(IEnumerable<TSource>)

使用預設相等比較子來比較值,從序列傳回不同的專案。

備註

結果序列是無序的。

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

來源:
Distinct.cs
來源:
Distinct.cs
來源:
Distinct.cs
來源:
Distinct.cs
來源:
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<TSource>

包含 IEnumerable<T> 源序列中不同元素的 。

例外狀況

sourcenull

範例

以下範例說明如何實作可用於該 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

實作此比較器後,你可以在方法中使用一串 Product 物件 Distinct ,如下範例所示:

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# 中的 foreach,或在 Visual Basic 中使用 For Each,才會執行。

Distinct<TSource>(IEnumerable<TSource>, IEqualityComparer<TSource>) 方法回傳一個無序序列,且不包含重複值。 若 comparernull則預設等式比較器 Default,用於比較數值。

適用於

Distinct<TSource>(IEnumerable<TSource>)

來源:
Distinct.cs
來源:
Distinct.cs
來源:
Distinct.cs
來源:
Distinct.cs
來源:
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<TSource>

包含 IEnumerable<T> 源序列中不同元素的 。

例外狀況

sourcenull

範例

以下程式碼範例示範如何使用 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> 通用介面。 以下程式碼範例展示了如何在自訂資料型別及提供GetHashCodeEquals方法中實作此介面。

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

實作此介面後,你可以在方法中使用一連串 Product 物件 Distinct<TSource>(IEnumerable<TSource>) ,如下範例所示:

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# 中的 foreach,或在 Visual Basic 中使用 For Each,才會執行。

Distinct<TSource>(IEnumerable<TSource>) 方法回傳一個無序序列,且不包含重複值。 它使用預設的等式比較器 Default,來比較數值。

在Visual Basic查詢表達式語法中,Distinct子句可轉譯為Distinct的呼叫。

預設的等式比較器 Default,用於比較實作 IEquatable<T> 通用介面的各類型值。 要比較自訂資料型別,你需要實作這個介面,並提供你自己的GetHashCodeEquals方法。

關於定義 IEqualityComparer<T> 自訂比較器的範例,請參見 Distinct<TSource>(IEnumerable<TSource>, IEqualityComparer<TSource>)

另請參閱

適用於