using System.Linq; public static class Enumerable { public static System.Collections.Generic.IEnumerable Except( this System.Collections.Generic.IEnumerable outer, System.Collections.Generic.IEnumerable inner, System.Func outerKeySelecter, System.Func innerKeySelecter ) { var comparer = System.Collections.Generic.EqualityComparer.Default; var i = inner.ToDictionary( innerKeySelecter, comparer ); return outer.Where( x => !i.ContainsKey( outerKeySelecter( x ) ) ); } public static System.Collections.Generic.IEnumerable Except( this System.Collections.Generic.IEnumerable outer, System.Collections.Generic.IEnumerable inner, System.Func outerKeySelecter, System.Func innerKeySelecter, System.Collections.Generic.IEqualityComparer comparer ) { var i = inner.ToDictionary( innerKeySelecter, comparer ); return outer.Where( x => !i.ContainsKey( outerKeySelecter( x ) ) ); } public static System.Collections.Generic.IDictionary ToDictionary( this System.Collections.Generic.IEnumerable collection, System.Func keySelector, System.Collections.Generic.IEqualityComparer keyComparer ) { System.Collections.Generic.IDictionary output = new System.Collections.Generic.Dictionary( keyComparer ); foreach ( var item in collection ) { output.Add( keySelector( item ), item ); } return output; } }