Enumerable.Except Metodo
Definizione
Produce la differenza insiemistica di due sequenze.Produces the set difference of two sequences.
Overload
Except<TSource>(IEnumerable<TSource>, IEnumerable<TSource>) |
Produce la differenza insiemistica di due sequenze utilizzando l'operatore di confronto eguaglianze predefinito per confrontare i valori.Produces the set difference of two sequences by using the default equality comparer to compare values. |
Except<TSource>(IEnumerable<TSource>, IEnumerable<TSource>, IEqualityComparer<TSource>) |
Produce la differenza insiemistica delle due sequenze utilizzando l’oggetto IEqualityComparer<T> specificato per confrontare i valori.Produces the set difference of two sequences by using the specified IEqualityComparer<T> to compare values. |
Commenti
La differenza di set di due set viene definita come membri del primo set che non vengono visualizzati nel secondo set.The set difference of two sets is defined as the members of the first set that don't appear in the second set.
Questo metodo restituisce gli elementi in first
che non sono presenti in second
.This method returns those elements in first
that don't appear in second
. Non restituisce gli elementi in second
che non sono presenti in first
.It doesn't return those elements in second
that don't appear in first
.
Vengono restituiti solo gli elementi univoci.Only unique elements are returned.
Except<TSource>(IEnumerable<TSource>, IEnumerable<TSource>)
Produce la differenza insiemistica di due sequenze utilizzando l'operatore di confronto eguaglianze predefinito per confrontare i valori.Produces the set difference of two sequences by using the default equality comparer to compare values.
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)
Parametri di tipo
- TSource
Tipo degli elementi delle sequenze di input.The type of the elements of the input sequences.
Parametri
- first
- IEnumerable<TSource>
Un oggetto IEnumerable<T> di cui saranno restituiti gli elementi che non sono presenti anche in second
.An IEnumerable<T> whose elements that are not also in second
will be returned.
- second
- IEnumerable<TSource>
Oggetto IEnumerable<T> i cui elementi, se presenti anche nella prima sequenza, saranno rimossi dalla sequenza restituita.An IEnumerable<T> whose elements that also occur in the first sequence will cause those elements to be removed from the returned sequence.
Restituisce
- IEnumerable<TSource>
Sequenza che contiene la differenza insiemistica degli elementi delle due sequenze.A sequence that contains the set difference of the elements of two sequences.
Eccezioni
first
o second
è null
.first
or second
is null
.
Esempio
Nell'esempio di codice riportato di seguito viene illustrato come utilizzare il Except<TSource>(IEnumerable<TSource>, IEnumerable<TSource>)
metodo per confrontare due sequenze di numeri e restituire elementi visualizzati solo nella prima sequenza.The following code example demonstrates how to use the Except<TSource>(IEnumerable<TSource>, IEnumerable<TSource>)
method to compare two sequences of numbers and return elements that appear only in the first sequence.
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
Se si desidera confrontare sequenze di oggetti di un tipo di dati personalizzato, è necessario implementare l' IEquatable<T> interfaccia generica in una classe helper.If you want to compare sequences of objects of some custom data type, you have to implement the IEquatable<T> generic interface in a helper class. Nell'esempio di codice seguente viene illustrato come implementare questa interfaccia in un tipo di dati personalizzato e come eseguire l'override dei GetHashCode Equals metodi e.The following code example shows how to implement this interface in a custom data type and override GetHashCode and Equals methods.
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
Dopo aver implementato questa interfaccia, è possibile utilizzare sequenze di ProductA
oggetti nel Except<TSource>(IEnumerable<TSource>, IEnumerable<TSource>)
metodo, come illustrato nell'esempio seguente:After you implement this interface, you can use sequences of ProductA
objects in the Except<TSource>(IEnumerable<TSource>, IEnumerable<TSource>)
method, as shown in the following example:
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
Commenti
Questo metodo viene implementato tramite l'esecuzione posticipata.This method is implemented by using deferred execution. Il valore restituito immediato è un oggetto che archivia tutte le informazioni necessarie per eseguire l'azione.The immediate return value is an object that stores all the information that is required to perform the action. La query rappresentata da questo metodo non viene eseguita finché l'oggetto non viene enumerato chiamando il relativo GetEnumerator
metodo direttamente o utilizzando foreach
in Visual C# o For Each
in 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.
L'operatore di confronto di uguaglianza predefinito, Default , viene utilizzato per confrontare i valori dei tipi.The default equality comparer, Default, is used to compare values of the types. Per confrontare un tipo di dati personalizzato, è necessario eseguire l'override dei Equals GetHashCode metodi e e, facoltativamente, implementare l' IEquatable<T> interfaccia generica nel tipo personalizzato.To compare a custom data type, you need to override the Equals and the GetHashCode methods, and optionally implement the IEquatable<T> generic interface in the custom type. Per altre informazioni, vedere la proprietà Default.For more information, see the Default property.
Si applica a
Except<TSource>(IEnumerable<TSource>, IEnumerable<TSource>, IEqualityComparer<TSource>)
Produce la differenza insiemistica delle due sequenze utilizzando l’oggetto IEqualityComparer<T> specificato per confrontare i valori.Produces the set difference of two sequences by using the specified IEqualityComparer<T> to compare values.
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)
Parametri di tipo
- TSource
Tipo degli elementi delle sequenze di input.The type of the elements of the input sequences.
Parametri
- first
- IEnumerable<TSource>
Un oggetto IEnumerable<T> di cui saranno restituiti gli elementi che non sono presenti anche in second
.An IEnumerable<T> whose elements that are not also in second
will be returned.
- second
- IEnumerable<TSource>
Oggetto IEnumerable<T> i cui elementi, se presenti anche nella prima sequenza, saranno rimossi dalla sequenza restituita.An IEnumerable<T> whose elements that also occur in the first sequence will cause those elements to be removed from the returned sequence.
- comparer
- IEqualityComparer<TSource>
Oggetto IEqualityComparer<T> per confrontare i valori.An IEqualityComparer<T> to compare values.
Restituisce
- IEnumerable<TSource>
Sequenza che contiene la differenza insiemistica degli elementi delle due sequenze.A sequence that contains the set difference of the elements of two sequences.
Eccezioni
first
o second
è null
.first
or second
is null
.
Esempio
Se si desidera confrontare sequenze di oggetti di un tipo di dati personalizzato, è necessario implementare l' IEqualityComparer<T> interfaccia generica in una classe helper.If you want to compare sequences of objects of some custom data type, you have to implement the IEqualityComparer<T> generic interface in a helper class. Nell'esempio di codice seguente viene illustrato come implementare questa interfaccia in un tipo di dati personalizzato e come specificare i GetHashCode Equals metodi e.The following code example shows how to implement this interface in a custom data type and provide GetHashCode and Equals methods. Nell'esempio seguente viene illustrato come implementare un operatore di confronto di uguaglianza che può essere utilizzato nel Except metodo.The following example shows how to implement an equality comparer that can be used in the Except 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
Dopo aver implementato questo operatore di confronto, è possibile usare le sequenze di Product
oggetti nel Except metodo, come illustrato nell'esempio seguente:After you implement this comparer, you can use sequences of Product
objects in the Except method, as shown in the following example:
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
Commenti
Se comparer
è null
, viene usato l'operatore di confronto di uguaglianza predefinito, Default , per confrontare i valori.If comparer
is null
, the default equality comparer, Default, is used to compare values.