Calculate strides to run up stairs The staircase has between 1 and 50 flights of stairs, inclusive. Each flight of stairs has between 5 and 30 steps, inclusive. StepsPerStride is between 2 and 5, inclusive. It takes 2 strides to turn around on the landing.

Example: 

Input: {15, 15}, StepsPerStride: 2, Returns: 18

There are two flights with a landing in between. 8 strides to get to the first landing, 2 strides to turn around, and 8 more strides to get to the top makes 8+2+8=18 strides

 public class RunUpTheStairs : IRunUpTheStairs
    {
        public ushort CalculateTotalStrides(byte[] stairs, byte stride)
        {
            if (!this.Validate(stairs, stride))
            {
                throw new ArgumentOutOfRangeException("stairs and / or stride are out of range.");
            }

            byte numberOfStrides = 0;
            foreach (byte flight in stairs)
            {
                numberOfStrides += (byte)(flight / stride);

                if (flight % stride != 0)
                {
                    numberOfStrides++;
                }
            }

            ushort totalStrides = (ushort)(numberOfStrides + (stairs.Length - 1) * 2);
            return totalStrides;
        }

        private bool Validate(byte[] stairs, byte stride)
        {
            if (stairs.Length &lt; 1 || stairs.Length &gt; 50)
            {
                return false;
            }

            if (stairs.Any(nextFlight =&gt; nextFlight &lt; 5 || nextFlight &gt; 30))
            {
                return false;
            }

            return stride &gt;= 2 &amp;&amp; stride &lt;= 5;
        }
    }


I am posting this for code review. Any improvements for performance will be much appreciated too!
You have one exception for different parameters and I believe it is wrong. You should separate validation of each argument and also use clear message instead of just "something is out of range".

Also I recommend to use ArgumentOutOfRangeException only for arguments that represent single value that is out of range. Length of an array argument is not an argument itself. Some invalid value inside the array is not an argument too.

So define validation methods

private bool IsStairsSizeValid(byte[] stairs)
{
    return stairs.Length &gt;= 1 &amp;&amp; stairs.Length &lt;= 50;
}

private bool AreStairsValuesValid(byte[] stairs)
{
    return stairs.All(nextFlight =&gt; nextFlight &gt;= 5 &amp;&amp; nextFlight &lt;= 30);
}

private bool IsStrideValid(byte stride)
{
    return stride &gt;= 2 &amp;&amp; stride &lt;= 5;
}


and then use them

if (!IsStairsSizeValid(stairs))
{
    throw new ArgumentException("Stairs has invalid size.", nameof(stairs));
}

if (!AreStairsValuesValid(stairs))
{
    throw new ArgumentException("Stairs contains invalid value.", nameof(stairs));
}

if (!IsStrideValid(stride))
{
    throw new ArgumentOutOfRangeException(nameof(stride), stride, "Stride is out of range.");
}


Also you should always check arguments of reference type on null in public API:

if (stairs == null)
{
    throw new ArgumentNullException(nameof(stairs));
}




I don't see any reason the numberOfStrides variable should have byte type. You use it within integer calculations so there is no point in byte. Declare it as int and remove casting to byte in the loop.

int numberOfStrides = 0;
foreach (var flight in stairs)
{
    numberOfStrides += flight / stride;




If you have division and remainder calculation for the same values it can be better to use Math.DivRem method:

numberOfStrides += Math.DivRem(flight / stride, out var remainder);
if (remainder != 0)
{
    numberOfStrides++;
}




There is no need to store result of calculations to local variable if you return it immidiately. So you can write just

return (ushort)(numberOfStrides + (stairs.Length - 1) * 2);