using System.Collections.Generic;
using Newtonsoft.Json.Linq;
namespace Exam1JesperZachrisson
public static dynamic DescriptiveStatistics(int[] source)
throw new System.ArgumentNullException("Parameter cannot be null", "source");
throw new System.InvalidOperationException("Sequence contains no elements");
int maximum = Maximum(source);
int minimum = Minimum(source);
double mean = Mean(source);
double median = Median(source);
int range = Range(source);
int[] mode = Mode(source);
double standardDeviation = StandardDeviation(source);
return $"Maximum: {maximum}\n" +
$"Minimum: {minimum}\n" +
$"Median: {median:f1}\n" +
$"Mode: {string.Join(", ", mode)}\n" +
$"Standard Deviation: {Math.Truncate(standardDeviation * 10) / 10}";
public static int Maximum(int[] source)
public static int Minimum(int[] source)
public static double Mean(int[] source)
public static double Median(int[] source)
int[] copiedArr = source.OrderBy(x => x).ToArray();
int middle = copiedArr.Length / 2;
if (copiedArr.Length % 2 == 0)
return ((double)copiedArr[middle - 1] + copiedArr[middle]) / 2;
return copiedArr[middle];
public static int Range(int[] source)
return source.Max() - source.Min();
public static int[] Mode(int[] source)
Dictionary<int, int> modeTable = new Dictionary<int, int>();
foreach( int num in source ) {
if ( modeTable.ContainsKey(num) )
modeTable[num] = modeTable[num] + 1;
var modeList = new List<int>();
var orderedList = modeTable.OrderBy(x => x.Value);
var highestOccurrence = orderedList.ElementAt(orderedList.Count()-1).Value;
.Where(kvp => kvp.Value == highestOccurrence)
.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
foreach(var item in mode.Keys)
modeList = modeList.OrderBy(i => i).ToList();
return modeList.ToArray();
public static double StandardDeviation(int[] source)
double average = source.Average();
var differences = source.Select(x => x - average).ToArray();
var multiplyDifferences = differences.Select(x => x * x);
var differencesAverage = multiplyDifferences.Average();
var standardDev = Math.Sqrt(differencesAverage);