Another approach:
public static IEnumerable<T> MyDistinct<T>(this IEnumerable<T> items) { T previous = default(T); bool first = true; foreach(T item in items) { if (first || !Equals(previous, item)) { first = false; previous = item; yield return item; } } }
Or, as requested, with a selector
public static IEnumerable<T> MyDistinct<T, U>(this IEnumerable<T> items, Func<T, U> selector) { U previous = default(U); bool first = true; foreach(T item in items) { U current = selector(item); if (first || !Equals(previous, current)) { first = false; previous = current; yield return item; } } }
source share