@@ -45,7 +45,7 @@ public double Similarity(string s1, string s2)
45
45
return 1.0d ;
46
46
}
47
47
48
- var matches = GetMatchList ( s1 , s2 ) ;
48
+ var matches = GetMatchList ( s1 . AsSpan ( ) , s2 . AsSpan ( ) ) ;
49
49
int sumOfMatches = 0 ;
50
50
51
51
foreach ( var match in matches )
@@ -68,40 +68,40 @@ public double Distance(string s1, string s2)
68
68
return 1.0d - Similarity ( s1 , s2 ) ;
69
69
}
70
70
71
- private static IList < string > GetMatchList ( string s1 , string s2 )
71
+ private static IList < string > GetMatchList ( ReadOnlySpan < char > s1 , ReadOnlySpan < char > s2 )
72
72
{
73
73
var list = new List < string > ( ) ;
74
74
var match = FrontMaxMatch ( s1 , s2 ) ;
75
75
76
76
if ( match . Length > 0 )
77
77
{
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 ) ) ;
80
80
var frontQueue = GetMatchList ( frontSource , frontTarget ) ;
81
81
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 ) ;
84
84
var endQueue = GetMatchList ( endSource , endTarget ) ;
85
85
86
- list . Add ( match ) ;
86
+ list . Add ( match . ToString ( ) ) ;
87
87
list . AddRange ( frontQueue ) ;
88
88
list . AddRange ( endQueue ) ;
89
89
}
90
90
91
91
return list ;
92
92
}
93
93
94
- private static string FrontMaxMatch ( string s1 , string s2 )
94
+ private static ReadOnlySpan < char > FrontMaxMatch ( ReadOnlySpan < char > s1 , ReadOnlySpan < char > s2 )
95
95
{
96
96
int longest = 0 ;
97
- var longestSubstring = "" ;
97
+ ReadOnlySpan < char > longestSubstring = ReadOnlySpan < char > . Empty ;
98
98
99
99
for ( int i = 0 ; i < s1 . Length ; ++ i )
100
100
{
101
101
for ( int j = i + 1 ; j <= s1 . Length ; ++ j )
102
102
{
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 )
105
105
{
106
106
longest = substring . Length ;
107
107
longestSubstring = substring ;
0 commit comments