using System.Text.RegularExpressions;
Console.WriteLine(Soundex.For("Trigger"));
Console.WriteLine(Soundex.For("Triggr"));
public static class Soundex
public static string For(string word)
const int MaxSoundexCodeLength = 4;
var soundexCode = new StringBuilder();
var previousWasHOrW = false;
word == null ? string.Empty : word.ToUpper(),
if (string.IsNullOrEmpty(word))
return string.Empty.PadRight(MaxSoundexCodeLength, '0');
soundexCode.Append(word.First());
for (var i = 1; i < word.Length; i++)
var numberCharForCurrentLetter = GetCharNumberForLetter(word[i]);
numberCharForCurrentLetter == GetCharNumberForLetter(soundexCode[0]))
if (soundexCode.Length > 2 && previousWasHOrW &&
numberCharForCurrentLetter == soundexCode[soundexCode.Length - 2])
if (soundexCode.Length > 0 &&
numberCharForCurrentLetter == soundexCode[soundexCode.Length - 1])
soundexCode.Append(numberCharForCurrentLetter);
previousWasHOrW = "HW".Contains(word[i]);
.Replace("0", string.Empty)
.PadRight(MaxSoundexCodeLength, '0')
.Substring(0, MaxSoundexCodeLength);
private static char GetCharNumberForLetter(char letter)
if ("BFPV".Contains(letter)) return '1';
if ("CGJKQSXZ".Contains(letter)) return '2';
if ("DT".Contains(letter)) return '3';
if ('L' == letter) return '4';
if ("MN".Contains(letter)) return '5';
if ('R' == letter) return '6';