using System.Collections.Generic;
public static class Extensions
public static IEnumerable<T> MyDistinct<T, V>(this IEnumerable<T> query,
Func<IGrouping<V,T>,T> h=null)
if (h==null) h=(x => x.First());
return query.GroupBy(f).Select(h);
public static IEnumerable<T> MyDistinct2<T, V>(this IEnumerable<T> query,
if (h == null) h = (y => true);
return query.GroupBy(f).Select(x=>x.FirstOrDefault(h));
public static void Main()
new MyObject() { Name = "Test1", Code = "T"},
new MyObject() { Name = "Test2", Code = "Q"},
new MyObject() { Name = "Test2", Code = "T"},
new MyObject() { Name = "Test5", Code = "Q"}
Console.WriteLine("First example");
var myQuery=(from x in _myObject select x).MyDistinct(d => d.Code);
Console.WriteLine(); Console.WriteLine(); Console.WriteLine("Second example");
var myQuery2 = (from x in _myObject select x).MyDistinct(d => d.Name,
x=>x.FirstOrDefault(y=>y.Name.Contains("1") || y.Name.Contains("2"))
Console.WriteLine(); Console.WriteLine(); Console.WriteLine("Third example");
var myQuery3 = (from x in _myObject select x).MyDistinct2(d => d.Name,
y => y.Name.Contains("1") || y.Name.Contains("2")