This indicator is good not only for numbers, but also for more complex types like date / time.
The second method allows you to provide a selector of results - useful in some cases.
public static IEnumerable<TItem> Range<TItem>( TItem itemFrom, TItem itemTo, Func<TItem, TItem> itemSelector ) where TItem : IComparable { // Call to the below method return Range(itemFrom, itemTo, itemSelector, o => o); } public static IEnumerable<TItem> Range<TItem, TResult>( TItem itemFrom, TItem itemTo, Func<TItem, TItem> itemSelector, Func<TItem, TResult> resultSelector ) where TItem : IComparable { while (true) { yield return resultSelector(itemFrom); if ((itemFrom = itemSelector(itemFrom)).CompareTo(itemTo) > 0) break; } }
Using:
Range(1, 10, o => o + 3);
1 4 7 10
Range( DateTime.Now, DateTime.Now.AddYears(1), o => o.AddMonths(1), o => o.ToString("MMMM"));
January February March April May June July August September October November December January
Kamarey
source share