Skip to content

Commit c3949ec

Browse files
committed
Merge branch 'SingThatSong-UseReadOnlySpan' into develop
2 parents 7c9c192 + 066d7d8 commit c3949ec

File tree

2 files changed

+12
-11
lines changed

2 files changed

+12
-11
lines changed

src/F23.StringSimilarity/F23.StringSimilarity.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
<ItemGroup>
2424
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.1.1" PrivateAssets="All" />
25+
<PackageReference Include="System.Memory" Version="4.5.4" />
2526
</ItemGroup>
2627

2728
<ItemGroup>

src/F23.StringSimilarity/RatcliffObershelp.cs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public double Similarity(string s1, string s2)
4545
return 1.0d;
4646
}
4747

48-
var matches = GetMatchList(s1, s2);
48+
var matches = GetMatchList(s1.AsSpan(), s2.AsSpan());
4949
int sumOfMatches = 0;
5050

5151
foreach (var match in matches)
@@ -68,40 +68,40 @@ public double Distance(string s1, string s2)
6868
return 1.0d - Similarity(s1, s2);
6969
}
7070

71-
private static IList<string> GetMatchList(string s1, string s2)
71+
private static IList<string> GetMatchList(ReadOnlySpan<char> s1, ReadOnlySpan<char> s2)
7272
{
7373
var list = new List<string>();
7474
var match = FrontMaxMatch(s1, s2);
7575

7676
if (match.Length > 0)
7777
{
78-
var frontSource = s1.Substring(0, s1.IndexOf(match, StringComparison.Ordinal));
79-
var frontTarget = s2.Substring(0, s2.IndexOf(match, StringComparison.Ordinal));
78+
var frontSource = s1.Slice(0, s1.IndexOf(match, StringComparison.Ordinal));
79+
var frontTarget = s2.Slice(0, s2.IndexOf(match, StringComparison.Ordinal));
8080
var frontQueue = GetMatchList(frontSource, frontTarget);
8181

82-
var endSource = s1.Substring(s1.IndexOf(match, StringComparison.Ordinal) + match.Length);
83-
var endTarget = s2.Substring(s2.IndexOf(match, StringComparison.Ordinal) + match.Length);
82+
var endSource = s1.Slice(s1.IndexOf(match, StringComparison.Ordinal) + match.Length);
83+
var endTarget = s2.Slice(s2.IndexOf(match, StringComparison.Ordinal) + match.Length);
8484
var endQueue = GetMatchList(endSource, endTarget);
8585

86-
list.Add(match);
86+
list.Add(match.ToString());
8787
list.AddRange(frontQueue);
8888
list.AddRange(endQueue);
8989
}
9090

9191
return list;
9292
}
9393

94-
private static string FrontMaxMatch(string s1, string s2)
94+
private static ReadOnlySpan<char> FrontMaxMatch(ReadOnlySpan<char> s1, ReadOnlySpan<char> s2)
9595
{
9696
int longest = 0;
97-
var longestSubstring = "";
97+
ReadOnlySpan<char> longestSubstring = ReadOnlySpan<char>.Empty;
9898

9999
for (int i = 0; i < s1.Length; ++i)
100100
{
101101
for (int j = i + 1; j <= s1.Length; ++j)
102102
{
103-
var substring = s1.Substring(i, j - i);
104-
if (s2.Contains(substring) && substring.Length > longest)
103+
var substring = s1.Slice(i, j - i);
104+
if (s2.Contains(substring, StringComparison.Ordinal) && substring.Length > longest)
105105
{
106106
longest = substring.Length;
107107
longestSubstring = substring;

0 commit comments

Comments
 (0)