Enumerable.Except Metodo
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Produce la differenza di set di due sequenze.
Overload
| Nome | Descrizione |
|---|---|
| Except<TSource>(IEnumerable<TSource>, IEnumerable<TSource>) |
Produce la differenza di set di due sequenze usando l'operatore di confronto di uguaglianza predefinito per confrontare i valori. |
| Except<TSource>(IEnumerable<TSource>, IEnumerable<TSource>, IEqualityComparer<TSource>) |
Produce la differenza di set di due sequenze usando il IEqualityComparer<T> specificato per confrontare i valori. |
Commenti
La differenza di set di due set viene definita come i membri del primo set che non vengono visualizzati nel secondo set.
Questo metodo restituisce gli elementi in first che non vengono visualizzati in second. Non restituisce gli elementi in second che non vengono visualizzati in first.
Vengono restituiti solo elementi univoci.
Except<TSource>(IEnumerable<TSource>, IEnumerable<TSource>)
- Origine:
- Except.cs
- Origine:
- Except.cs
- Origine:
- Except.cs
- Origine:
- Except.cs
- Origine:
- Except.cs
Produce la differenza di set di due sequenze usando l'operatore di confronto di uguaglianza predefinito per confrontare i valori.
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.
Parametri
- first
- IEnumerable<TSource>
Oggetto IEnumerable<T> i cui elementi non sono presenti anche in second verranno restituiti.
- second
- IEnumerable<TSource>
Oggetto IEnumerable<T> i cui elementi che si verificano anche nella prima sequenza causeranno la rimozione di tali elementi dalla sequenza restituita.
Restituisce
Sequenza che contiene la differenza di set degli elementi di due sequenze.
Eccezioni
first o second è null.
Esempio
Nell'esempio di codice seguente 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.
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
Per confrontare sequenze di oggetti di un tipo di dati personalizzato, è necessario implementare l'interfaccia IEquatable<T> generica in una classe helper. Nell'esempio di codice seguente viene illustrato come implementare questa interfaccia in un tipo di dati personalizzato ed eseguire l'override dei GetHashCode metodi e 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
Dopo aver implementato questa interfaccia, è possibile usare sequenze di ProductA oggetti nel Except<TSource>(IEnumerable<TSource>, IEnumerable<TSource>) metodo , come illustrato nell'esempio seguente:
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 usando l'esecuzione posticipata. Il valore restituito immediato è un oggetto che archivia tutte le informazioni necessarie per eseguire l'azione. La query rappresentata da questo metodo non viene eseguita finché l'oggetto non viene enumerato chiamando direttamente il GetEnumerator relativo metodo o usando foreach in C# o For Each in Visual Basic.
L'operatore di confronto di uguaglianza predefinito, Default, viene usato per confrontare i valori dei tipi. Per confrontare un tipo di dati personalizzato, è necessario eseguire l'override dei EqualsGetHashCode metodi e e, facoltativamente, implementare l'interfaccia IEquatable<T> generica nel tipo personalizzato. Per ulteriori informazioni, consultare la proprietà Default.
Si applica a
Except<TSource>(IEnumerable<TSource>, IEnumerable<TSource>, IEqualityComparer<TSource>)
- Origine:
- Except.cs
- Origine:
- Except.cs
- Origine:
- Except.cs
- Origine:
- Except.cs
- Origine:
- Except.cs
Produce la differenza di set di due sequenze usando il IEqualityComparer<T> specificato per confrontare i valori.
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.
Parametri
- first
- IEnumerable<TSource>
Oggetto IEnumerable<T> i cui elementi non sono presenti anche in second verranno restituiti.
- second
- IEnumerable<TSource>
Oggetto IEnumerable<T> i cui elementi che si verificano anche nella prima sequenza causeranno la rimozione di tali elementi dalla sequenza restituita.
- comparer
- IEqualityComparer<TSource>
Oggetto IEqualityComparer<T> da confrontare.
Restituisce
Sequenza che contiene la differenza di set degli elementi di due sequenze.
Eccezioni
first o second è null.
Esempio
Per confrontare sequenze di oggetti di un tipo di dati personalizzato, è necessario implementare l'interfaccia IEqualityComparer<T> generica in una classe helper. Nell'esempio di codice seguente viene illustrato come implementare questa interfaccia in un tipo di dati personalizzato e fornire GetHashCode metodi e Equals . Nell'esempio seguente viene illustrato come implementare un operatore di confronto di uguaglianza che può essere usato nel Except metodo .
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 sequenze di Product oggetti nel Except metodo , come illustrato nell'esempio seguente:
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, l'operatore di confronto di uguaglianza predefinito, Default, viene usato per confrontare i valori.