共用方式為


Enumerable.Except 方法

定義

產生兩個序列的集合差。

多載

名稱 Description
Except<TSource>(IEnumerable<TSource>, IEnumerable<TSource>)

使用預設相等比較子來比較值,產生兩個序列的集合差異。

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

使用指定的 IEqualityComparer<T> 來比較值,產生兩個序列的集合差異。

備註

兩個集合的集合差定義為第一個集合中不出現在第二個集合中的成員。

此方法回傳 中 first 未出現的 second元素。 它不會回傳那些 second 在 中沒有出現 first的元素。 僅回傳獨特的元素。

Except<TSource>(IEnumerable<TSource>, IEnumerable<TSource>)

來源:
Except.cs
來源:
Except.cs
來源:
Except.cs
來源:
Except.cs
來源:
Except.cs

使用預設相等比較子來比較值,產生兩個序列的集合差異。

public:
generic <typename TSource>
[System::Runtime::CompilerServices::Extension]
 static System::Collections::Generic::IEnumerable<TSource> ^ Except(System::Collections::Generic::IEnumerable<TSource> ^ first, System::Collections::Generic::IEnumerable<TSource> ^ second);
public static System.Collections.Generic.IEnumerable<TSource> Except<TSource>(this System.Collections.Generic.IEnumerable<TSource> first, System.Collections.Generic.IEnumerable<TSource> second);
static member Except : seq<'Source> * seq<'Source> -> seq<'Source>
<Extension()>
Public Function Except(Of TSource) (first As IEnumerable(Of TSource), second As IEnumerable(Of TSource)) As IEnumerable(Of TSource)

類型參數

TSource

輸入序列元素的類型。

參數

first
IEnumerable<TSource>

一個 IEnumerable<T>second 在其中的元素會被返回。

second
IEnumerable<TSource>

如果 IEnumerable<T> 第一個序列中也出現了元素,則會將這些元素從回傳序列中移除。

傳回

IEnumerable<TSource>

包含兩個序列元素集合差的序列。

例外狀況

firstsecondnull

範例

以下程式碼範例示範如何使用此 Except<TSource>(IEnumerable<TSource>, IEnumerable<TSource>) 方法比較兩組數字序列,並回傳只出現在第一個序列中的元素。

double[] numbers1 = { 2.0, 2.0, 2.1, 2.2, 2.3, 2.3, 2.4, 2.5 };
double[] numbers2 = { 2.2 };

IEnumerable<double> onlyInFirstSet = numbers1.Except(numbers2);

foreach (double number in onlyInFirstSet)
    Console.WriteLine(number);

/*
 This code produces the following output:

 2
 2.1
 2.3
 2.4
 2.5
*/
' Create two arrays of doubles.
Dim numbers1() As Double = {2.0, 2.0, 2.1, 2.2, 2.3, 2.3, 2.4, 2.5}
Dim numbers2() As Double = {2.2}

' Select the elements from the first array that are not
' in the second array.
Dim onlyInFirstSet As IEnumerable(Of Double) = numbers1.Except(numbers2)

Dim output As New System.Text.StringBuilder
For Each number As Double In onlyInFirstSet
    output.AppendLine(number)
Next

' Display the output.
Console.WriteLine(output.ToString())

' This code produces the following output:
'
' 2
' 2.1
' 2.3
' 2.4
' 2.5

如果你想比較某個自訂資料型態的物件序列,你必須在輔助類別中實作 IEquatable<T> 通用介面。 以下程式碼範例說明如何在自訂資料型別中實作此介面,並覆寫 GetHashCode and Equals 方法。

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

    public bool Equals(ProductA other)
    {
        if (other is null)
            return false;

        return this.Name == other.Name && this.Code == other.Code;
    }

    public override bool Equals(object obj) => Equals(obj as ProductA);
    public override int GetHashCode() => (Name, Code).GetHashCode();
}
Public Class ProductA
    Inherits IEquatable(Of ProductA)

    Public Property Name As String
    Public Property Code As Integer

    Public Function Equals(ByVal other As ProductA) As Boolean
        If other Is Nothing Then Return False
        Return Me.Name = other.Name AndAlso Me.Code = other.Code
    End Function

    Public Overrides Function Equals(ByVal obj As Object) As Boolean
        Return Equals(TryCast(obj, ProductA))
    End Function

    Public Overrides Function GetHashCode() As Integer
        Return (Name, Code).GetHashCode()
    End Function

End Class

實作此介面後,你可以在方法中使用物件序列ProductAExcept<TSource>(IEnumerable<TSource>, IEnumerable<TSource>),如下範例所示:

ProductA[] fruits1 = { new ProductA { Name = "apple", Code = 9 },
                       new ProductA { Name = "orange", Code = 4 },
                        new ProductA { Name = "lemon", Code = 12 } };

ProductA[] fruits2 = { new ProductA { Name = "apple", Code = 9 } };

// Get all the elements from the first array
// except for the elements from the second array.

IEnumerable<ProductA> except =
    fruits1.Except(fruits2);

foreach (var product in except)
    Console.WriteLine(product.Name + " " + product.Code);

/*
  This code produces the following output:

  orange 4
  lemon 12
*/
Dim fruits1() As Product = 
    {New Product With {.Name = "apple", .Code = 9}, 
     New Product With {.Name = "orange", .Code = 4}, 
     New Product With {.Name = "lemon", .Code = 12}}

Dim fruits2() As Product = 
    {New Product With {.Name = "apple", .Code = 9}}

' Get all the elements from the first array
' except for the elements from the second array.

Dim except = fruits1.Except(fruits2)

For Each product In except
    Console.WriteLine(product.Name & " " & product.Code)
Next

' This code produces the following output:
'
' apple 9
' orange 4
' lemon 12

備註

此方法透過延遲執行實現。 立即回傳值是一個物件,儲存執行動作所需的所有資訊。 此方法所表示的查詢,直到物件被枚舉,無論是直接呼叫其 GetEnumerator 方法,或使用 foreach C# 或 For Each Visual Basic 來執行。

預設的等號比較器 Default,用於比較各類型的值。 要比較自訂資料型別,你需要覆寫 Equals 和 方法 GetHashCode ,並可選擇在自訂型別中實作 IEquatable<T> 通用介面。 如需詳細資訊,請參閱 Default 屬性 (Property)。

適用於

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

來源:
Except.cs
來源:
Except.cs
來源:
Except.cs
來源:
Except.cs
來源:
Except.cs

使用指定的 IEqualityComparer<T> 來比較值,產生兩個序列的集合差異。

public:
generic <typename TSource>
[System::Runtime::CompilerServices::Extension]
 static System::Collections::Generic::IEnumerable<TSource> ^ Except(System::Collections::Generic::IEnumerable<TSource> ^ first, System::Collections::Generic::IEnumerable<TSource> ^ second, System::Collections::Generic::IEqualityComparer<TSource> ^ comparer);
public static System.Collections.Generic.IEnumerable<TSource> Except<TSource>(this System.Collections.Generic.IEnumerable<TSource> first, System.Collections.Generic.IEnumerable<TSource> second, System.Collections.Generic.IEqualityComparer<TSource> comparer);
public static System.Collections.Generic.IEnumerable<TSource> Except<TSource>(this System.Collections.Generic.IEnumerable<TSource> first, System.Collections.Generic.IEnumerable<TSource> second, System.Collections.Generic.IEqualityComparer<TSource>? comparer);
static member Except : seq<'Source> * seq<'Source> * System.Collections.Generic.IEqualityComparer<'Source> -> seq<'Source>
<Extension()>
Public Function Except(Of TSource) (first As IEnumerable(Of TSource), second As IEnumerable(Of TSource), comparer As IEqualityComparer(Of TSource)) As IEnumerable(Of TSource)

類型參數

TSource

輸入序列元素的類型。

參數

first
IEnumerable<TSource>

一個 IEnumerable<T>second 在其中的元素會被返回。

second
IEnumerable<TSource>

如果 IEnumerable<T> 第一個序列中也出現了元素,則會將這些元素從回傳序列中移除。

comparer
IEqualityComparer<TSource>

然後 IEqualityComparer<T> 比較價值。

傳回

IEnumerable<TSource>

包含兩個序列元素集合差的序列。

例外狀況

firstsecondnull

範例

如果你想比較某個自訂資料型態的物件序列,你必須在輔助類別中實作 IEqualityComparer<T> 通用介面。 以下程式碼範例展示了如何在自訂資料型別及提供GetHashCodeEquals方法中實作此介面。 以下範例說明如何實作可用於該 Except 方法的等號比較器。

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

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

Product[] fruits1 = { new Product { Name = "apple", Code = 9 },
                       new Product { Name = "orange", Code = 4 },
                        new Product { Name = "lemon", Code = 12 } };

Product[] fruits2 = { new Product { Name = "apple", Code = 9 } };

// Get all the elements from the first array
// except for the elements from the second array.

IEnumerable<Product> except =
    fruits1.Except(fruits2, new ProductComparer());

foreach (var product in except)
    Console.WriteLine(product.Name + " " + product.Code);

/*
  This code produces the following output:

  orange 4
  lemon 12
*/
Dim fruits1() As Product = 
    {New Product With {.Name = "apple", .Code = 9}, 
     New Product With {.Name = "orange", .Code = 4}, 
     New Product With {.Name = "lemon", .Code = 12}}

Dim fruits2() As Product = 
    {New Product With {.Name = "apple", .Code = 9}}

' Get all the elements from the first array
' except for the elements from the second array.

Dim except = fruits1.Except(fruits2, New ProductComparer())

For Each product In except
    Console.WriteLine(product.Name & " " & product.Code)
Next

' This code produces the following output:
'
' orange 4
' lemon 12

備註

comparernull則預設等式比較器 Default,用於比較數值。

另請參閱

適用於