diff --git a/ShittyLINQ/Average.cs b/ShittyLINQ/Average.cs new file mode 100644 index 0000000..70bf130 --- /dev/null +++ b/ShittyLINQ/Average.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; + +namespace ShittyLINQ +{ + public static partial class Extensions + { + /// + /// Calculates the average nummeric value + /// of an IEnumerable collection. + /// + private static R Average(this IEnumerable self) + { + if (self == null) + { + throw new ArgumentNullException(); + } + + dynamic sum = default(R); + int count = 0; + + foreach (var number in self) + { + sum += number; + count++; + } + + if (count == 0) + { + throw new InvalidOperationException("The sequence is empty."); + } + + return sum / count; + } + + public static double Average(this IEnumerable self) + { + return self.Average(); + } + + public static float Average(this IEnumerable self) + { + return self.Average(); + } + + public static double Average(this IEnumerable self) + { + return self.Average(); + } + + public static double Average(this IEnumerable self) + { + return self.Average(); + } + } +} diff --git a/ShittyLinqTests/AverageTests.cs b/ShittyLinqTests/AverageTests.cs new file mode 100644 index 0000000..28888af --- /dev/null +++ b/ShittyLinqTests/AverageTests.cs @@ -0,0 +1,66 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using ShittyLINQ; +using System; + +namespace ShittyTests +{ + [TestClass] + public class AverageTests + { + [TestMethod] + public void Ints() + { + int[] numbers = new int[] { 0, 7, 4, 1 }; + double expectedResult = 3d; + double actualResult = numbers.Average(); + + Assert.AreEqual(expectedResult, actualResult); + } + + [TestMethod] + public void Floats() + { + float[] numbers = new float[] { 3.5f, -4f, 14f, 7f }; + float expectedResult = 5.125f; + float actualResult = numbers.Average(); + + Assert.AreEqual(expectedResult, actualResult); + } + + [TestMethod] + public void Doubles() + { + double[] numbers = new double[] { -1.25d, 2.75d, 7.5d, -4d }; + double expectedResult = 1.25d; + double actualResult = numbers.Average(); + + Assert.AreEqual(expectedResult, actualResult); + } + + [TestMethod] + public void Longs() + { + long[] numbers = new long[] { 5, 3, 17, 1 }; + double expectedResult = 6.5d; + double actualResult = numbers.Average(); + + Assert.AreEqual(expectedResult, actualResult); + } + + [TestMethod] + [ExpectedException(typeof(InvalidOperationException))] + public void CollectionIsEmpty() + { + int[] numbers = new int[] { }; + numbers.Average(); + } + + [TestMethod] + [ExpectedException(typeof(ArgumentNullException))] + public void CollectionIsNull() + { + int[] numbers = null; + numbers.Average(); + } + } +}