using System.Linq;
public static class DifferenceOfSquares
{
public static int CalculateSquareOfSum(int max) =>
Square(Enumerable.Range(1, max).Sum());
public static int CalculateSumOfSquares(int max) =>
Enumerable.Range(1, max).Sum(Square);
public static int CalculateDifferenceOfSquares(int max) =>
CalculateSquareOfSum(max) - CalculateSumOfSquares(max);
private static int Square(int number) => number * number;
}
Before we start, let's define a helper method to square a number:
private static int Square(int number) => number * number;
Having this method will allow us to write more concise code later on.
Method: CalculateSquareOfSum()
The square of the sum is defined as: sum all numbers from 1
to the provided max
, and then square that number.
We can get an enumerable for all the numbers using LINQ's Enumerable.Range()
method:
Enumerable.Range(1, max)
Summing these numbers is a simple matter of calling the Sum()
method on the enumerable:
Enumerable.Range(1, max).Sum()
Finally, we can pass this sum to our Square()
helper method to calculate the correct value.
public static int CalculateSquareOfSum(int max) =>
Square(Enumerable.Range(1, max).Sum());
Method: CalculateSumOfSquares()
The calculate the sum of the squares, we once again start out with creating an enumerable of the numbers from 1
to max
:
Enumerable.Range(1, max).Sum()
We then need to square these numbers, which we can do using the Select()
method:
Enumerable.Range(1, max).Select(n => Square(n))
We can then call Sum()
to return the correct value:
public static int CalculateSumOfSquares(int max) =>
Enumerable.Range(1, max).Select(n => Square(n)).Sum();
Shortening
There are two things we can do to shorten this method.
The first is that instead of doing Select()
and then Sum()
, we can use the overload of the Sum()
method that takes a lambda (this will have the exact same effect):
public static int CalculateSumOfSquares(int max) =>
Enumerable.Range(1, max).Sum(n => Square(n));
And finally, as the lambda used in the Select()
method just passes the argument to a function, we can use a method group to shorten this to:
public static int CalculateSumOfSquares(int max) =>
Enumerable.Range(1, max).Sum(Square);
Method: CalculateDifferenceOfSquares()
The CalculateDifferenceOfSquares()
method is nothing more than calling the two methods we just created:
public static int CalculateDifferenceOfSquares(int max) =>
CalculateSquareOfSum(max) - CalculateSumOfSquares(max);