Esempio n. 1
0
            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));
            }
Esempio n. 2
0
        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);
            }