using System.Collections.Generic;
public static void Main()
IComparableExtensionExamples();
private static void IComparableExtensionExamples()
Console.WriteLine($"{age,-3} is over 30 {age.Between(30, 30).ToYesNo()}");
Console.WriteLine($"{age,-3} is over 30 {age.Between(30, 31).ToYesNo()}");
Console.WriteLine($"is child {age.IsChild().ToYesNo()}");
DateTime lowDateTime = new(2022, 1, 1);
DateTime someDateTime = new(2022, 1, 2);
DateTime highDateTime = new(2022, 1, 8);
Console.WriteLine($"{someDateTime:d} between {lowDateTime:d} and {highDateTime:d}? {someDateTime.Between(lowDateTime, highDateTime).ToYesNo()}");
someDateTime = new DateTime(2022, 2, 2);
Console.WriteLine($"{someDateTime:d} between {lowDateTime:d} and {highDateTime:d}? {someDateTime.Between(lowDateTime, highDateTime).ToYesNo()}");
Console.WriteLine($"30.IsOver30() {30.IsOver30()}");
Console.WriteLine($"31.IsOver30() {31.IsOver30()}");
public static class GenericExtensions
public static bool Between<T>(this T value, T lowerValue, T upperValue)
where T : struct, IComparable<T>
=> Comparer<T>.Default.Compare(value, lowerValue) >= 0 &&
Comparer<T>.Default.Compare(value, upperValue) <= 0;
public static bool BetweenExclusive<T>(this IComparable<T> sender, T minimumValue, T maximumValue)
=> sender.CompareTo(minimumValue) > 0 && sender.CompareTo(maximumValue) < 0;
public static bool IsGreaterThan<T>(this T sender, T value) where T : IComparable
=> sender.CompareTo(value) > 0;
public static bool IsLessThan<T>(this T sender, T value) where T : IComparable
=> sender.CompareTo(value) < 0;
public static bool IsChild(this int sender)
=> sender.Between(1, 12);
public static bool IsOver30(this int sender) => sender.IsGreaterThan(30);
public static string CaseWhen(this int sender)
{ } value1 and >= 7 and <= 14 => $"I am 7 or above but less than 14: {value1}",
{ } value2 when value2.Between(4, 6) => $"I am between 4 and 6: {value2}",
{ } value3 when (value3.IsLessThan(3)) => $"I am 3 or less: {value3}",
public static class StringExtensions
public static string ToYesNo(this bool value)