Enumerable.Except<TSource> Method (IEnumerable<TSource>, IEnumerable<TSource>, IEqualityComparer<TSource>)
Produces the set difference of two sequences by using the specified IEqualityComparer<T> to compare values.
Namespace: System.Linq
Assembly: System.Core (in System.Core.dll)
public static IEnumerable<TSource> Except<TSource>( this IEnumerable<TSource> first, IEnumerable<TSource> second, IEqualityComparer<TSource> comparer )
Type Parameters
- TSource
The type of the elements of the input sequences.
Parameters
- first
- Type: System.Collections.Generic.IEnumerable<TSource>
An IEnumerable<T> whose elements that are not also in second will be returned.
- second
- Type: System.Collections.Generic.IEnumerable<TSource>
An IEnumerable<T> whose elements that also occur in the first sequence will cause those elements to be removed from the returned sequence.
- comparer
- Type: System.Collections.Generic.IEqualityComparer<TSource>
An IEqualityComparer<T> to compare values.
Return Value
Type: System.Collections.Generic.IEnumerable<TSource>A sequence that contains the set difference of the elements of two sequences.
Usage Note
In Visual Basic and C#, you can call this method as an instance method on any object of type IEnumerable<TSource>. When you use instance method syntax to call this method, omit the first parameter. For more information, see Extension Methods (Visual Basic) or Extension Methods (C# Programming Guide).| Exception | Condition |
|---|---|
| ArgumentNullException | first or second is null. |
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; } }
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
*/
Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (Server Core Role not supported), Windows Server 2008 R2 (Server Core Role supported with SP1 or later; Itanium not supported)
The .NET Framework does not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.