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();
+ }
+ }
+}