Skip to content

Commit

Permalink
Merge branch 'release/5.1.0'
Browse files Browse the repository at this point in the history
  • Loading branch information
paulirwin committed Jan 16, 2023
2 parents 0297e67 + 382ca40 commit 1fa3892
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 18 deletions.
10 changes: 3 additions & 7 deletions src/F23.StringSimilarity/F23.StringSimilarity.csproj
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">

<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>netstandard2.0</TargetFrameworks>
<PackageId>F23.StringSimilarity</PackageId>
<PackageVersion>5.0.0</PackageVersion>
<PackageTags>string;similarity;distance;levenshtein;jaro-winkler;lcs;cosine</PackageTags>
<Title>StringSimilarity.NET</Title>
<Authors>James Blair, Paul Irwin</Authors>
Expand All @@ -18,18 +16,16 @@
<PublishRepositoryUrl>true</PublishRepositoryUrl>
<IncludeSymbols>true</IncludeSymbols>
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
<Version>5.1.0</Version>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.1.1" PrivateAssets="All" />
<PackageReference Include="System.Memory" Version="4.5.4" />
</ItemGroup>

<ItemGroup>
<None Include="logo.png" Pack="true" PackagePath="\" />
</ItemGroup>

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<DocumentationFile>bin\Release\netstandard2.0\F23.StringSimilarity.xml</DocumentationFile>
</PropertyGroup>

</Project>
22 changes: 11 additions & 11 deletions src/F23.StringSimilarity/RatcliffObershelp.cs
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ public double Similarity(string s1, string s2)
return 1.0d;
}

var matches = GetMatchList(s1, s2);
var matches = GetMatchList(s1.AsSpan(), s2.AsSpan());
int sumOfMatches = 0;

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

private static IList<string> GetMatchList(string s1, string s2)
private static IList<string> GetMatchList(ReadOnlySpan<char> s1, ReadOnlySpan<char> s2)
{
var list = new List<string>();
var match = FrontMaxMatch(s1, s2);

if (match.Length > 0)
{
var frontSource = s1.Substring(0, s1.IndexOf(match, StringComparison.Ordinal));
var frontTarget = s2.Substring(0, s2.IndexOf(match, StringComparison.Ordinal));
var frontSource = s1.Slice(0, s1.IndexOf(match, StringComparison.Ordinal));
var frontTarget = s2.Slice(0, s2.IndexOf(match, StringComparison.Ordinal));
var frontQueue = GetMatchList(frontSource, frontTarget);

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

list.Add(match);
list.Add(match.ToString());
list.AddRange(frontQueue);
list.AddRange(endQueue);
}

return list;
}

private static string FrontMaxMatch(string s1, string s2)
private static ReadOnlySpan<char> FrontMaxMatch(ReadOnlySpan<char> s1, ReadOnlySpan<char> s2)
{
int longest = 0;
var longestSubstring = "";
ReadOnlySpan<char> longestSubstring = ReadOnlySpan<char>.Empty;

for (int i = 0; i < s1.Length; ++i)
{
for (int j = i + 1; j <= s1.Length; ++j)
{
var substring = s1.Substring(i, j - i);
if (s2.Contains(substring) && substring.Length > longest)
var substring = s1.Slice(i, j - i);
if (s2.Contains(substring, StringComparison.Ordinal) && substring.Length > longest)
{
longest = substring.Length;
longestSubstring = substring;
Expand Down

0 comments on commit 1fa3892

Please sign in to comment.