using System.Collections.Generic;
public static void Main()
var ranges = "11220, 11221; 6337461000000000, 6337468549999999; 945, 965;";
var numRanges = GetRanges(ranges);
var testNumbers = new long[]{ 1234561234560000L, 1000000000000000L, 9500000000000000L, 6337461000000123};
foreach(var cardNo in testNumbers)
Console.WriteLine( "'{0}' is {1}valid!",cardNo, IsValid(cardNo, numRanges)?"":"not " );
public static bool IsValid(long cardNumber, IEnumerable<CardRange> ranges) => ranges.Any(x => x.Contains(cardNumber));
public static IEnumerable<CardRange> GetRanges(ReadOnlySpan<char> input)
var ranges = new List<CardRange>();
var semiIndex = input.IndexOf(';');
var strRange = input[..semiIndex];
ranges.Add(CardRange.FromSpan(strRange));
if(semiIndex < input.Length)
input = input[(semiIndex+1)..];
semiIndex = input.IndexOf(';');
public long LowerBound {get; set;} = 0;
public long UpperBound {get; set;} = long.MaxValue;
public bool Contains(long cardNumber) => cardNumber >= LowerBound && cardNumber <= UpperBound;
public static CardRange FromSpan(ReadOnlySpan<char> input)
var commaIndex = input.IndexOf(',');
LowerBound = long.Parse(input[..commaIndex].Trim().ToString().PadRight(16, '0')),
UpperBound = long.Parse(input[(commaIndex+1)..].Trim().ToString().PadRight(16, '0')),