Enumerable.Except 方法
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
產生兩個序列的集合差。
多載
| 名稱 | 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> 第一個序列中也出現了元素,則會將這些元素從回傳序列中移除。
傳回
包含兩個序列元素集合差的序列。
例外狀況
first 或 second 為 null。
範例
以下程式碼範例示範如何使用此 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> 比較價值。
傳回
包含兩個序列元素集合差的序列。
例外狀況
first 或 second 為 null。
範例
如果你想比較某個自訂資料型態的物件序列,你必須在輔助類別中實作 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
備註
若 comparer , null則預設等式比較器 Default,用於比較數值。