namespace System.Linq; // extend Microsoft's namespace public static class MyLinqExtensions { // this is a chainable LINQ extension method public static IEnumerable ProcessSequence( this IEnumerable sequence) { // you could do some processing here return sequence; } public static IQueryable ProcessSequence( this IQueryable sequence) { // you could do some processing here return sequence; } // these are scalar LINQ extension methods public static int? Median( this IEnumerable sequence) { var ordered = sequence.OrderBy(item => item); int middlePosition = ordered.Count() / 2; return ordered.ElementAt(middlePosition); } public static int? Median( this IEnumerable sequence, Func selector) { return sequence.Select(selector).Median(); } public static decimal? Median( this IEnumerable sequence) { var ordered = sequence.OrderBy(item => item); int middlePosition = ordered.Count() / 2; return ordered.ElementAt(middlePosition); } public static decimal? Median( this IEnumerable sequence, Func selector) { return sequence.Select(selector).Median(); } public static int? Mode( this IEnumerable sequence) { var grouped = sequence.GroupBy(item => item); var orderedGroups = grouped.OrderByDescending( group => group.Count()); return orderedGroups.FirstOrDefault()?.Key; } public static int? Mode( this IEnumerable sequence, Func selector) { return sequence.Select(selector)?.Mode(); } public static decimal? Mode( this IEnumerable sequence) { var grouped = sequence.GroupBy(item => item); var orderedGroups = grouped.OrderByDescending( group => group.Count()); return orderedGroups.FirstOrDefault()?.Key; } public static decimal? Mode( this IEnumerable sequence, Func selector) { return sequence.Select(selector).Mode(); } }