Created
January 12, 2021 14:24
-
-
Save mjs3339/7e699b8e1301f0fcec2277c65195e845 to your computer and use it in GitHub Desktop.
Custom Linq Range Class
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Collections.Generic; | |
using System.Numerics; | |
public static class LinqHelper | |
{ | |
/// <summary> | |
/// Generates a sequence of character values within a specified range starting at | |
/// 'form' through 'to' with a given step value. | |
/// </summary> | |
public static IEnumerable<char> Range(char from, char to, char step = '\x0001') | |
{ | |
var d = '\x0'; | |
while((char) (from + (uint) d) < to) | |
{ | |
yield return(char) (from + (uint) d); | |
d += step; | |
} | |
} | |
/// <summary> | |
/// Generates a sequence of 8-bit signed numbers within a specified range starting at | |
/// 'form' through 'to' with a given step value. | |
/// </summary> | |
public static IEnumerable<sbyte> Range(sbyte from, sbyte to, sbyte step = 1) | |
{ | |
var d = 0; | |
while((sbyte) (from + d) < to) | |
{ | |
yield return(sbyte) (from + d); | |
d += step; | |
} | |
} | |
/// <summary> | |
/// Generates a sequence of 8-bit unsigned numbers within a specified range starting at | |
/// 'form' through 'to' with a given step value. | |
/// </summary> | |
public static IEnumerable<byte> Range(byte from, byte to, byte step = 1) | |
{ | |
var d = 0; | |
while((byte) (from + d) < to) | |
{ | |
yield return(byte) (from + d); | |
d += step; | |
} | |
} | |
/// <summary> | |
/// Generates a sequence of 16-bit signed numbers within a specified range starting at | |
/// 'form' through 'to' with a given step value. | |
/// </summary> | |
public static IEnumerable<short> Range(short from, short to, short step = 1) | |
{ | |
var d = 0; | |
while((short) (from + d) < to) | |
{ | |
yield return(short) (from + d); | |
d += step; | |
} | |
} | |
/// <summary> | |
/// Generates a sequence of 16-bit unsigned numbers within a specified range starting at | |
/// 'form' through 'to' with a given step value. | |
/// </summary> | |
public static IEnumerable<ushort> Range(ushort from, ushort to, ushort step = 1) | |
{ | |
var d = 0; | |
while((ushort) (from + d) < to) | |
{ | |
yield return(ushort) (from + d); | |
d += step; | |
} | |
} | |
/// <summary> | |
/// Generates a sequence of 32-bit signed numbers within a specified range starting at | |
/// 'form' through 'to' with a given step value. | |
/// </summary> | |
public static IEnumerable<int> Range(int from, int to, int step = 1) | |
{ | |
var d = 0; | |
while(from + d < to) | |
{ | |
yield return from + d; | |
d += step; | |
} | |
} | |
/// <summary> | |
/// Generates a sequence of 32-bit unsigned numbers within a specified range starting at | |
/// 'form' through 'to' with a given step value. | |
/// </summary> | |
public static IEnumerable<uint> Range(uint from, uint to, uint step = 1) | |
{ | |
var d = 0u; | |
while(from + d < to) | |
{ | |
yield return from + d; | |
d += step; | |
} | |
} | |
/// <summary> | |
/// Generates a sequence of 64-bit signed numbers within a specified range starting at | |
/// 'form' through 'to' with a given step value. | |
/// </summary> | |
public static IEnumerable<long> Range(long from, long to, long step = 1) | |
{ | |
var d = 0l; | |
while(from + d < to) | |
{ | |
yield return from + d; | |
d += step; | |
} | |
} | |
/// <summary> | |
/// Generates a sequence of 64-bit unsigned numbers within a specified range starting at | |
/// 'form' through 'to' with a given step value. | |
/// </summary> | |
public static IEnumerable<ulong> Range(ulong from, ulong to, ulong step = 1) | |
{ | |
var d = 0ul; | |
while(from + d < to) | |
{ | |
yield return from + d; | |
d += step; | |
} | |
} | |
/// <summary> | |
/// Generates a sequence of arbitrarily large signed numbers within a specified range starting at | |
/// 'form' through 'to' with a given step value. | |
/// </summary> | |
public static IEnumerable<BigInteger> Range(BigInteger from, BigInteger to, BigInteger step) | |
{ | |
var count = to - from; | |
for(var i = BigInteger.Zero; i < count; i = i + step) | |
yield return from + i; | |
} | |
/// <summary> | |
/// Generates a sequence of arbitrarily large floating point precision numbers within a specified range starting at | |
/// 'form' through 'to' with a given step value. | |
/// </summary> | |
public static IEnumerable<BigRational> Range(BigRational from, BigRational to, BigRational step) | |
{ | |
if(step == 0) | |
step = 1; | |
var count = to - from; | |
for(BigRational i = 0; i < count; i = +step) | |
yield return from + i; | |
} | |
/// <summary> | |
/// Generates a sequence of single precision floating-point numbers within a specified range starting at | |
/// 'form' through 'to' with a given step value. | |
/// </summary> | |
public static IEnumerable<float> Range(float from, float to, float step = 1) | |
{ | |
var d = 0f; | |
while(from + d < to) | |
{ | |
yield return from + d; | |
d += step; | |
} | |
} | |
/// <summary> | |
/// Generates a sequence of double precision floating-point numbers within a specified range starting at | |
/// 'form' through 'to' with a given step value. | |
/// </summary> | |
public static IEnumerable<double> Range(double from, double to, double step = 1) | |
{ | |
var d = 0d; | |
while(from + d < to) | |
{ | |
yield return from + d; | |
d += step; | |
} | |
} | |
/// <summary> | |
/// Generates a sequence of decimal numbers within a specified range starting at | |
/// 'form' through 'to' with a given step value. | |
/// </summary> | |
public static IEnumerable<decimal> Range(decimal from, decimal to, decimal step = 1) | |
{ | |
decimal d = 0; | |
while(from + d < to) | |
{ | |
yield return from + d; | |
d += step; | |
} | |
} | |
/// <summary> | |
/// Generates a sequence of DateTime numbers within a specified range starting at | |
/// 'form' through 'to' with a given step value in days. | |
/// </summary> | |
public static IEnumerable<DateTime> Range(DateTime from, DateTime to, double step = 1) | |
{ | |
var d = from; | |
while(d < to) | |
{ | |
yield return d; | |
d = d.AddDays(step); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment