- Notifications
You must be signed in to change notification settings - Fork 1.6k
/
Copy pathSoundexEncoder.cs
110 lines (99 loc) · 2.94 KB
/
SoundexEncoder.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
usingSystem.Collections.Generic;
usingSystem.Linq;
namespaceAlgorithms.Encoders;
/// <summary>
/// Class for Soundex encoding strings.
/// </summary>
publicclassSoundexEncoder
{
/// <summary>
/// Encodes a string using the Soundex Algorithm.
/// </summary>
/// <param name="text">The string to encode.</param>
/// <returns>The Soundex encoded string (one uppercase character and three digits).</returns>
publicstringEncode(stringtext)
{
text=text.ToLowerInvariant();
varchars=OmitHAndW(text);
IEnumerable<int>numbers=ProduceNumberCoding(chars);
numbers=CollapseDoubles(numbers);
numbers=OmitVowels(numbers);
numbers=CollapseLeadingDigit(numbers,text[0]);
numbers=numbers.Take(3);
numbers=PadTo3Numbers(numbers);
varfinal=numbers.ToArray();
return$"{text.ToUpperInvariant()[0]}{final[0]}{final[1]}{final[2]}";
}
privateIEnumerable<int>CollapseLeadingDigit(IEnumerable<int>numbers,charc)
{
usingvarenumerator=numbers.GetEnumerator();
enumerator.MoveNext();
if(enumerator.Current==MapToNumber(c))
{
enumerator.MoveNext();
}
do
{
yieldreturnenumerator.Current;
}
while(enumerator.MoveNext());
}
privateIEnumerable<int>PadTo3Numbers(IEnumerable<int>numbers)
{
usingvarenumerator=numbers.GetEnumerator();
for(vari=0;i<3;i++)
{
yieldreturnenumerator.MoveNext()
?enumerator.Current
:0;
}
}
privateIEnumerable<int>OmitVowels(IEnumerable<int>numbers)=>numbers.Where(i =>i!=0);
privateIEnumerable<char>OmitHAndW(stringtext)=>text.Where(c =>c!='h'&&c!='w');
privateIEnumerable<int>CollapseDoubles(IEnumerable<int>numbers)
{
varprevious=int.MinValue;
foreach(variinnumbers)
{
if(previous!=i)
{
yieldreturni;
previous=i;
}
}
}
privateIEnumerable<int>ProduceNumberCoding(IEnumerable<char>text)=>text.Select(MapToNumber);
privateintMapToNumber(charch)
{
varmapping=newDictionary<char,int>
{
['a']=0,
['e']=0,
['i']=0,
['o']=0,
['u']=0,
['y']=0,
['h']=8,
['w']=8,
['b']=1,
['f']=1,
['p']=1,
['v']=1,
['c']=2,
['g']=2,
['j']=2,
['k']=2,
['q']=2,
['s']=2,
['x']=2,
['z']=2,
['d']=3,
['t']=3,
['l']=4,
['m']=5,
['n']=5,
['r']=6,
};
returnmapping[ch];
}
}