public static IEnumerable <T> FindMissingNumbersFromSequence <T>(IEnumerable <T> arr, MinMax <T> mnmx = null) where T : struct { if (!arr.Any(x => x.IsNumericType())) { Console.WriteLine("Type '{0}' can't be used as a numeric type!", typeof(T).Name); yield break; } if (mnmx != null) { arr.Add(mnmx.min); arr.Add(mnmx.max); } IOrderedEnumerable <T> list = arr.OrderBy(x => x); T n = default(T); foreach (T num in list) { T op = (dynamic)num - n; if ((dynamic)op > 1) { int max = op.ConvertValue <int>(); for (int l = 1; l < max; ++l) { yield return((dynamic)n + l.ConvertValue <T>()); } } n = (dynamic)num; } }
public static bool FindFirstMissingNumberFromSequence <T>(this IEnumerable <T> arr, out T n, MinMax <T> mnmx = null) { //Dupe if (!arr.Any(x => x.IsNumericType())) { Console.WriteLine("Type '{0}' can't be used as a numeric type!", typeof(T).Name); n = default(T); return(false); } if (mnmx != null) { arr.Add(mnmx.min); arr.Add(mnmx.max); } IOrderedEnumerable <T> list = arr.OrderBy(x => x); //End dupe bool b = false; n = default(T); foreach (T num in list) { b = (dynamic)num - n > 1; if (b) { break; } else { n = (dynamic)num; } } n = (dynamic)n + 1; return(b); }