Overview

In many real world scenarios you work with large collections of numbers. VB.Net has several functions for analyzing these collections, such as Sum, Count, Average, Min, Max. This example adds several more functions:

  • Median: This is the midpoint number in the ASC sorted collection
  • ModeThis is the most frequent number(s) in the collection
  • RangeThe difference between Max and Min
  • IQR: The difference between the third Quartile (Q3) and the first Quartile (Q1)
  • Q1The Median of the first half of the sorted collection
  • Q3:  The Median of the second half of the sorted collection
  • StdDev: A measure of how spread the numbers are.
 

These are overloaded for use with collections of all standard numeric datatypes.



An Example of the Overloaded Functions


#Region "     Byte"
 
    <Extension>
    Public Function Median(l As IEnumerable(Of Byte)) As Decimal
        l = l.OrderBy(Function(b) b)
        If l.Count Mod 2 = 1 Then 'odd count
            Return CDec(l(CInt(Math.Floor(l.Count / 2))))
        Else 'even count
            Return CDec((l(l.Count \ 2 - 1) + l(l.Count \ 2)) / 2)
        End If
    End Function
 
    <Extension>
    Public Function Mode(l As IEnumerable(Of Byte)) As String
        Dim occurrences As New Dictionary(Of Byte, Integer)
 
        For x As Integer = 0 To l.Count - 1
            If occurrences.ContainsKey(l(x)) Then
                occurrences(l(x)) += 1
            Else
                occurrences.Add(l(x), 1)
            End If
        Next
 
        Return String.Join(", ", occurrences.Where(Function(kvp1) kvp1.Value = occurrences.Max(Function(kvp2) kvp2.Value)).Select(Function(kvp3) kvp3.Key.ToString).ToArray)
    End Function
 
    <Extension>
    Public Function Range(l As IEnumerable(Of Byte)) As Byte
        Return l.Max - l.Min
    End Function
 
    <Extension>
    Public Function IQR(l As IEnumerable(Of Byte)) As Decimal
        Return Q3(l) - Q1(l)
    End Function
 
    <Extension>
    Public Function Q1(l As IEnumerable(Of Byte)) As Decimal
        Return quartiles(l)
    End Function
 
    <Extension>
    Public Function Q3(l As IEnumerable(Of Byte)) As Decimal
        Return quartiles(l, False)
    End Function
 
    Private Function quartiles(l As IEnumerable(Of Byte), Optional Q1 As Boolean = True) As Decimal
        Dim count As Integer = l.Count
        l = l.OrderBy(Function(x) x)
 
        Dim firstHalf As New List(Of Decimal)
        Dim secondHalf As New List(Of Decimal)
 
        Dim half As Integer
 
        If count Mod 2 = 1 Then 'odd count
            half = CInt(Math.Floor(count / 2))
        Else 'even count
            half = count \ 2
        End If
 
        firstHalf.AddRange(Array.ConvertAll(l.Cast(Of Byte).Take(half).ToArray, Function(b) CDec(b)))
        secondHalf.AddRange(Array.ConvertAll(l.Cast(Of Byte).Skip(count - half).ToArray, Function(b) CDec(b)))
 
        Return If(Q1, Median(firstHalf), Median(secondHalf))
 
    End Function
 
    <Extension>
    Public Function StdDev(l As IEnumerable(Of Byte), Optional population As Boolean = True) As Decimal
        Dim mean As Decimal = l.Average(Function(x) CDec(x))
 
        Dim squaredDifference() As Decimal = Array.ConvertAll(l.ToArray, Function(x As Byte) CDec((x - mean) ^ 2))
 
        Return If(population, CDec(Math.Sqrt(squaredDifference.Average)), CDec(Math.Sqrt(minusOneAverage(squaredDifference))))
    End Function
 
#End Region

Downloads