Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 6 additions & 10 deletions FuzzySharp/Extractor/ExtractedResult.cs
Original file line number Diff line number Diff line change
@@ -1,19 +1,15 @@
using System;
using System.Collections.Generic;

namespace FuzzySharp.Extractor
{
public class ExtractedResult<T> : IComparable<ExtractedResult<T>>
public struct ExtractedResult<T> : IComparable<ExtractedResult<T>>
{
public T Value { get; }
public int Score { get; }
public int Index { get; }

public readonly T Value;
public readonly int Score;
public readonly int Index;

public ExtractedResult(T value, int score)
public ExtractedResult(T value, int score) : this(value, score, 0)
{
Value = value;
Score = score;
}

public ExtractedResult(T value, int score, int index)
Expand All @@ -25,7 +21,7 @@ public ExtractedResult(T value, int score, int index)

public int CompareTo(ExtractedResult<T> other)
{
return Comparer<int>.Default.Compare(this.Score, other.Score);
return Score.CompareTo(other.Score);
}

public override string ToString()
Expand Down
11 changes: 7 additions & 4 deletions FuzzySharp/PreProcess/StringPreprocessorFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,14 @@ namespace FuzzySharp.PreProcess
{
internal class StringPreprocessorFactory
{
private static string pattern = "[^ a-zA-Z0-9]";
private static readonly Regex FullMatchRegex = new Regex("[^ a-zA-Z0-9]", RegexOptions.Compiled);

private static readonly Func<string, string> CacheDefault = Default;
private static readonly Func<string, string> Ident = x => x;

private static string Default(string input)
{
input = Regex.Replace(input, pattern, " ");
input = FullMatchRegex.Replace(input, " ");;
input = input.ToLower();

return input.Trim();
Expand All @@ -20,9 +23,9 @@ public static Func<string, string> GetPreprocessor(PreprocessMode mode)
switch (mode)
{
case PreprocessMode.Full:
return Default;
return CacheDefault;
case PreprocessMode.None:
return s => s;
return Ident;
default:
throw new InvalidOperationException($"Invalid string preprocessor mode: {mode}");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@ namespace FuzzySharp.SimilarityRatio.Scorer.StrategySensitive
{
public class DefaultRatioScorer : SimpleRatioScorerBase
{
protected override Func<string, string, int> Scorer => DefaultRatioStrategy.Calculate;
protected override Func<string, string, int> Scorer => DefaultRatioStrategy.CacheCalculate;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@ namespace FuzzySharp.SimilarityRatio.Scorer.StrategySensitive
{
public class PartialRatioScorer : SimpleRatioScorerBase
{
protected override Func<string, string, int> Scorer => PartialRatioStrategy.Calculate;
protected override Func<string, string, int> Scorer => PartialRatioStrategy.CacheCalculate;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@ namespace FuzzySharp.SimilarityRatio.Scorer.StrategySensitive
{
public class PartialTokenAbbreviationScorer : TokenAbbreviationScorerBase
{
protected override Func<string, string, int> Scorer => PartialRatioStrategy.Calculate;
protected override Func<string, string, int> Scorer => PartialRatioStrategy.CacheCalculate;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@ namespace FuzzySharp.SimilarityRatio.Scorer.StrategySensitive
{
public class TokenAbbreviationScorer : TokenAbbreviationScorerBase
{
protected override Func<string, string, int> Scorer => DefaultRatioStrategy.Calculate;
protected override Func<string, string, int> Scorer => DefaultRatioStrategy.CacheCalculate;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@ namespace FuzzySharp.SimilarityRatio.Scorer.StrategySensitive
{
public class PartialTokenDifferenceScorer : TokenDifferenceScorerBase
{
protected override Func<string[], string[], int> Scorer => PartialRatioStrategy<string>.Calculate;
protected override Func<string[], string[], int> Scorer => PartialRatioStrategy<string>.CacheCalculate;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@ namespace FuzzySharp.SimilarityRatio.Scorer.StrategySensitive
{
public class TokenDifferenceScorer : TokenDifferenceScorerBase
{
protected override Func<string[], string[], int> Scorer => DefaultRatioStrategy<string>.Calculate;
protected override Func<string[], string[], int> Scorer => DefaultRatioStrategy<string>.CacheCalculate;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@ namespace FuzzySharp.SimilarityRatio.Scorer.StrategySensitive
{
public class PartialTokenInitialismScorer : TokenInitialismScorerBase
{
protected override Func<string, string, int> Scorer => PartialRatioStrategy.Calculate;
protected override Func<string, string, int> Scorer => PartialRatioStrategy.CacheCalculate;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@ namespace FuzzySharp.SimilarityRatio.Scorer.StrategySensitive
{
public class TokenInitialismScorer : TokenInitialismScorerBase
{
protected override Func<string, string, int> Scorer => DefaultRatioStrategy.Calculate;
protected override Func<string, string, int> Scorer => DefaultRatioStrategy.CacheCalculate;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@ namespace FuzzySharp.SimilarityRatio.Scorer.StrategySensitive
{
public class PartialTokenSetScorer : TokenSetScorerBase
{
protected override Func<string, string, int> Scorer => PartialRatioStrategy.Calculate;
protected override Func<string, string, int> Scorer => PartialRatioStrategy.CacheCalculate;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@ namespace FuzzySharp.SimilarityRatio.Scorer.StrategySensitive
{
public class TokenSetScorer : TokenSetScorerBase
{
protected override Func<string, string, int> Scorer => DefaultRatioStrategy.Calculate;
protected override Func<string, string, int> Scorer => DefaultRatioStrategy.CacheCalculate;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@ namespace FuzzySharp.SimilarityRatio.Scorer.StrategySensitive
{
public class PartialTokenSortScorer : TokenSortScorerBase
{
protected override Func<string, string, int> Scorer => PartialRatioStrategy.Calculate;
protected override Func<string, string, int> Scorer => PartialRatioStrategy.CacheCalculate;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,12 @@ namespace FuzzySharp.SimilarityRatio.Scorer.StrategySensitive
{
public abstract class TokenSortScorerBase : StrategySensitiveScorerBase
{
private static readonly Regex SpaceRegex = new Regex(@"\s+", RegexOptions.Compiled);

public override int Score(string input1, string input2)
{
var sorted1 = String.Join(" ", Regex.Split(input1, @"\s+").Where(s => s.Any()).OrderBy(s => s)).Trim();
var sorted2 = String.Join(" ", Regex.Split(input2, @"\s+").Where(s => s.Any()).OrderBy(s => s)).Trim();
var sorted1 = String.Join(" ", SpaceRegex.Split(input1).Where(s => s.Any()).OrderBy(s => s)).Trim();
var sorted2 = String.Join(" ", SpaceRegex.Split(input2).Where(s => s.Any()).OrderBy(s => s)).Trim();

return Scorer(sorted1, sorted2);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@ namespace FuzzySharp.SimilarityRatio.Scorer.StrategySensitive
{
public class TokenSortScorer : TokenSortScorerBase
{
protected override Func<string, string, int> Scorer => DefaultRatioStrategy.Calculate;
protected override Func<string, string, int> Scorer => DefaultRatioStrategy.CacheCalculate;
}
}
10 changes: 7 additions & 3 deletions FuzzySharp/SimilarityRatio/ScorerCache.cs
Original file line number Diff line number Diff line change
@@ -1,15 +1,19 @@
using System;
using System.Collections.Concurrent;
using System.Runtime.CompilerServices;
using FuzzySharp.SimilarityRatio.Scorer;

namespace FuzzySharp.SimilarityRatio
{
public static class ScorerCache
{
private static readonly ConcurrentDictionary<Type, IRatioScorer> s_scorerCache = new ConcurrentDictionary<Type, IRatioScorer>();
public static IRatioScorer Get<T>() where T : IRatioScorer, new()
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static IRatioScorer Get<T>() where T : IRatioScorer, new() => GenericCache<T>.Instance;

private static class GenericCache<T>
where T : IRatioScorer, new()
{
return s_scorerCache.GetOrAdd(typeof(T), new T());
public static readonly T Instance = new T();
}
}
}
2 changes: 2 additions & 0 deletions FuzzySharp/SimilarityRatio/Strategy/DefaultRatioStrategy.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ namespace FuzzySharp.SimilarityRatio.Strategy
{
internal class DefaultRatioStrategy
{
public static readonly Func<string, string, int> CacheCalculate = Calculate;

public static int Calculate(string input1, string input2)
{
if (input1.Length == 0 || input2.Length == 0)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ namespace FuzzySharp.SimilarityRatio.Strategy.Generic
{
internal class DefaultRatioStrategy<T> where T : IEquatable<T>
{
public static readonly Func<T[], T[], int> CacheCalculate = Calculate;

public static int Calculate(T[] input1, T[] input2)
{
if (input1.Length == 0 || input2.Length == 0)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ namespace FuzzySharp.SimilarityRatio.Strategy.Generic
{
internal class PartialRatioStrategy<T> where T : IEquatable<T>
{
public static readonly Func<T[], T[], int> CacheCalculate = Calculate;

public static int Calculate(T[] input1, T[] input2)
{
T[] shorter;
Expand Down
2 changes: 2 additions & 0 deletions FuzzySharp/SimilarityRatio/Strategy/PartialRatioStrategy.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ namespace FuzzySharp.SimilarityRatio.Strategy
{
internal class PartialRatioStrategy
{
public static readonly Func<string, string, int> CacheCalculate = Calculate;

public static int Calculate(string input1, string input2)
{
string shorter;
Expand Down