/// <summary>
 /// Accepts any two IEnumerables and returns only the items in the first that do not appear in the second
 /// </summary>
 /// <typeparam name="T">Any type</typeparam>
 /// <param name="value">The IEnumerable to inspect</param>
 /// <param name="compareTo">The IEnumerable to compareTo</param>
 /// <param name="compareFieldPredicate">A predicate that is invoked for each item in both collections which performs the logical comparison</param>
 /// <returns>An IEnumerable that contains only the distinct items</returns>
 public static IEnumerable <T> Distinct <T, TProp>(this IEnumerable <T> value, IEnumerable <T> compareTo, Func <T, TProp> compareFieldPredicate) where TProp : IEquatable <TProp>
 {
     return(value.Where(o => !compareTo.Exists(p => compareFieldPredicate.Invoke(p).Equals(compareFieldPredicate.Invoke(o)))));
 }