Extension Methods

Extension methods must live in a Module and be marked <Extension()>. The first parameter is the extended type.

In VB, extension methods can't be called on a late-bound Object variable.

Imports System.Runtime.CompilerServices

Public Module StringExtensions
    <Extension()>
    Public Function IsValidEmail(s As String) As Boolean
        Return s IsNot Nothing AndAlso Text.RegularExpressions.Regex.IsMatch(s, "^[^@\s]+@[^@\s]+\.[^@\s]+$")
    End Function

    <Extension()>
    Public Function Truncate(s As String, maxLength As Integer, Optional suffix As String = "...") As String
        If String.IsNullOrEmpty(s) OrElse s.Length <= maxLength Then Return s
        Return s.Substring(0, maxLength) & suffix
    End Function

    <Extension()>
    Public Function WordCount(s As String) As Integer
        Return s.Split({" "c}, StringSplitOptions.RemoveEmptyEntries).Length
    End Function

    <Extension()>
    Public Iterator Function EveryOther(Of T)(source As IEnumerable(Of T)) As IEnumerable(Of T)
        Dim i = 0
        For Each item In source
            If i Mod 2 = 0 Then Yield item
            i += 1
        Next
    End Function
End Module

Console.WriteLine("[email protected]".IsValidEmail())
Console.WriteLine("A very long description".Truncate(10))
Console.WriteLine({1, 2, 3, 4, 5}.EveryOther().Count())