using System; using System.Diagnostics.Contracts; using System.Linq; namespace SystemX.Net.Platform.Common.ExtensionMethods { public static class EmComparable { /// /// [min, max] /// value 값이 from, to 사이에 존재하는지를 검사한다. /// http://stackoverflow.com/questions/8776624/if-value-in-rangex-y-function-c-sharp /// [Pure] public static bool InClosedRange(this T val, T min, T max) where T : IComparable { Contract.Requires(min.CompareTo(max) <= 0); return min.CompareTo(val) <= 0 && val.CompareTo(max) <= 0; } [Pure] public static bool InRange(this T val, T min, T max) where T : IComparable { return val.InClosedRange(min, max); } /// [min, max) [Pure] public static bool InClampRange(this T val, T min, T max) where T : IComparable { Contract.Requires(min.CompareTo(max) <= 0); return min.CompareTo(val) <= 0 && val.CompareTo(max) < 0; } /// (min, max) [Pure] public static bool InOpenRange(this T val, T min, T max) where T : IComparable { Contract.Requires(min.CompareTo(max) <= 0); return min.CompareTo(val) < 0 && val.CompareTo(max) < 0; } [Pure] public static bool EpsilonEqual(this double value1, double value2, double epsilon = Double.Epsilon) { return Math.Abs(value1 - value2) < epsilon; } [Pure] public static bool EpsilonEqual(this float value1, float value2, float epsilon = Single.Epsilon) { return Math.Abs(value1 - value2) < epsilon; } /// Key 값이 set 에 포함되는지 여부를 검사한다. [Pure] public static bool IsOneOf(this IComparable key, params IComparable[] set) { return set.Any(e => e.CompareTo(key) == 0); } public static bool IsOneOf(this object key, params object[] set) { return set.Any(e => e == key); } public static bool IsOneOf(this Type type, params Type[] set) { return set.Any(t => t.IsAssignableFrom(type)); } } }