using System.Collections.Generic;
public static void Main()
var authors = new Author[]
FirstName = "Joseph", Surname = "Albahari"
FirstName = "Ben", Surname = "Albahari"
FirstName = "Andrew", Surname = "Troelsen"
FirstName = "Joseph", Surname = "Albahari"
FirstName = "Ben", Surname = "Albahari"
DistinctAnonymous(authors);
DistinctAnonymousCastBack(authors);
DistinctByGrouping(authors);
DistinctByComparer(authors);
DistinctByExtension(authors);
DistinctByExtension2(authors);
private static void PrintAuthors(IEnumerable<Author> authors)
Console.WriteLine("AUTHORS:");
foreach (var author in authors)
Console.WriteLine("{0} {1}", author.FirstName, author.Surname);
private static void SimpleDistinct()
var cleanedNumbers = numbers.Distinct();
foreach (var number in cleanedNumbers)
Console.WriteLine(number);
private static void DistinctAnonymous(IEnumerable<Author> authors)
var cleanedAuthors = authors.Select(a => new
FirstName = a.FirstName, Surname = a.Surname
foreach (var author in authors)
Console.WriteLine("{0} {1}", author.FirstName, author.Surname);
private static void DistinctAnonymousCastBack(IEnumerable<Author> authors)
var cleanedAuthors = authors.Select(a => new
FirstName = a.FirstName, Surname = a.Surname
).Distinct().Select(a => new Author
FirstName = a.FirstName, Surname = a.Surname
PrintAuthors(cleanedAuthors);
private static void DistinctByGrouping(IEnumerable<Author> authors)
var cleanedAuthors = authors.GroupBy(a => new
).Select(g => g.First());
PrintAuthors(cleanedAuthors);
private static void DistinctByComparer(IEnumerable<Author> authors)
var cleanedAuthors = authors.Distinct(new AuthorComparer());
PrintAuthors(cleanedAuthors);
private static void DistinctByExtension(IEnumerable<Author> authors)
var cleanedAuthors = authors.Distinct(a => a.Surname);
PrintAuthors(cleanedAuthors);
private static void DistinctByExtension2(IEnumerable<Author> authors)
var cleanedAuthors = authors.Distinct(a => new
PrintAuthors(cleanedAuthors);
public class AuthorComparer : IEqualityComparer<Author>
public bool Equals(Author x, Author y)
return x.FirstName.Equals(y.FirstName) && x.Surname.Equals(y.Surname);
public int GetHashCode(Author obj)
hash = hash * 23 + obj.FirstName.GetHashCode();
hash = hash * 23 + obj.Surname.GetHashCode();
public static class LinqExtension
public static IEnumerable<T> Distinct<T>(this IEnumerable<T> input, Func<T, object> keySelector)
return input.Distinct(new ByKeyComparer<T>(keySelector));
public class ByKeyComparer<T> : IEqualityComparer<T>
private readonly Func<T, object> keySelector;
public ByKeyComparer(Func<T, object> keySelector)
this.keySelector = keySelector;
public bool Equals(T x, T y)
return this.keySelector(x).Equals(this.keySelector(y));
public int GetHashCode(T obj)
return this.keySelector(obj).GetHashCode();