static Span <LetterPair> GetAllPairs(string s) { Span <LetterPair> pairs = new LetterPair[s.Length - 1];//cannot stackalloc here, use stackalloc if inlining int pos = 0; for (int i = 0; i < s.Length - 1; i++) { if (s[i] != ' ' && s[i + 1] != ' ') { pairs[pos++] = new LetterPair(s[i], s[i + 1]); } } return(pairs.Slice(0, pos)); }
public static float CompareStrings(string str1, string str2, bool caseSensitive) { if (string.IsNullOrWhiteSpace(str1) || string.IsNullOrWhiteSpace(str2)) { return(0); } Span <LetterPair> pairs1 = GetAllPairs(caseSensitive ? str1 : str1.ToUpperInvariant()); Span <LetterPair> pairs2 = GetAllPairs(caseSensitive ? str2 : str2.ToUpperInvariant()); if (pairs1.Length == 0 || pairs2.Length == 0) { return(0); } else { bool[] usedPairs = new bool[pairs2.Length]; int intersection = 0; int union = pairs1.Length + pairs2.Length; for (int i = 0; i < pairs1.Length; i++) { LetterPair pair1 = pairs1[i]; for (int j = 0; j < pairs2.Length; j++) { if (!usedPairs[j] && pair1 == pairs2[j]) { intersection++; usedPairs[j] = true; break; } } } return((2f * intersection) / union); }