Questo articolo è stato tradotto automaticamente. Per visualizzare l'articolo in inglese, selezionare la casella di controllo Inglese. È possibile anche visualizzare il testo inglese in una finestra popup posizionando il puntatore del mouse sopra il testo.
Traduzione
Inglese

Metodo Enumerable.Except<TSource>(IEnumerable<TSource>, IEnumerable<TSource>)

 

Data di pubblicazione: ottobre 2016

Produce la differenza insiemistica di due sequenze utilizzando l'operatore di confronto di uguaglianza predefinito per confrontare i valori.

Spazio dei nomi:   System.Linq
Assembly:  System.Core (in System.Core.dll)

public static IEnumerable<TSource> Except<TSource>(
	this IEnumerable<TSource> first,
	IEnumerable<TSource> second
)

Parametri

first
Type: System.Collections.Generic.IEnumerable<TSource>

Un IEnumerable<T> i cui elementi che non sono presenti anche in second verranno restituiti.

second
Type: System.Collections.Generic.IEnumerable<TSource>

Un IEnumerable<T> i cui elementi che sono presenti anche nella prima sequenza determinerà gli elementi da rimuovere dalla sequenza restituita.

Valore restituito

Type: System.Collections.Generic.IEnumerable<TSource>

Sequenza che contiene la differenza insiemistica degli elementi delle due sequenze.

Parametri tipo

TSource

Tipo degli elementi delle sequenze di input.

Exception Condition
ArgumentNullException

first o second è null.

Questo metodo viene implementato tramite 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 viene enumerata chiamando il relativo GetEnumerator metodo direttamente o tramite foreach in Visual C# o For Each in Visual Basic.

La differenza insiemistica di due set è definita come i membri del primo set che non vengono visualizzati nel secondo set.

System_CAPS_noteNota

Questo metodo restituisce gli elementi in first che non sono presenti second. Non viene restituito anche gli elementi in second che non sono presenti first.

Operatore di uguaglianza predefinito Default, viene utilizzato per confrontare i valori dei tipi che implementano il IEqualityComparer<T> interfaccia generica. Per confrontare un tipo di dati personalizzato, è necessario implementare questa interfaccia e fornire il proprio GetHashCode e Equals metodi per il tipo.

Esempio di codice seguente viene illustrato come utilizzare il Except<TSource>(IEnumerable<TSource>, IEnumerable<TSource>) per confrontare due sequenze di numeri e restituire gli elementi che vengono 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
*/

Se si desidera confrontare le sequenze di oggetti di un tipo di dati personalizzato, è necessario implementare il IEqualityComparer<T> interfaccia generica in un helperclass. Esempio di codice seguente viene illustrato come implementare questa interfaccia in un tipo di dati personalizzati e fornire GetHashCode e Equals metodi.

public class ProductA
{ 
    public string Name { get; set; }
    public int Code { get; set; }
}

public class ProductComparer : IEqualityComparer<ProductA>
{

    public bool Equals(ProductA x, ProductA y)
    {
        //Check whether the objects are the same object. 
        if (Object.ReferenceEquals(x, y)) return true;

        //Check whether the products' properties are equal. 
        return x != null && y != null && x.Code.Equals(y.Code) && x.Name.Equals(y.Name);
    }

    public int GetHashCode(ProductA obj)
    {
        //Get hash code for the Name field if it is not null. 
        int hashProductName = obj.Name == null ? 0 : obj.Name.GetHashCode();

        //Get hash code for the Code field. 
        int hashProductCode = obj.Code.GetHashCode();

        //Calculate the hash code for the product. 
        return hashProductName ^ hashProductCode;
    }
}

Dopo aver implementato questa interfaccia, è possibile utilizzare sequenze di ProductA gli oggetti di 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
*/

Universal Windows Platform
Disponibile da 8
.NET Framework
Disponibile da 3.5
Libreria di classi portabile
Supportato in: piattaforme .NET portabili
Silverlight
Disponibile da 2.0
Windows Phone Silverlight
Disponibile da 7.0
Windows Phone
Disponibile da 8.1
Torna all'inizio
Mostra: