コード例 #1
0
        public void Compare()
        {
            using (new CultureSwapper(PredefinedCulture.EnglishUnitedStates))
            {
                Assert.AreEqual(0, Math.Sign(SubstringCompare.Compare("abcdef", 2, 2, "CD", 0, 2, StringComparison.CurrentCultureIgnoreCase)));
                Assert.AreEqual(-1, Math.Sign(SubstringCompare.Compare("abcdef", 1, 3, "CD", 0, 2, StringComparison.OrdinalIgnoreCase)),
                                "'b' should be less than 'C' for case-insensitive comparison");
                Assert.AreEqual(1, Math.Sign(SubstringCompare.Compare("abcdef", 1, 3, "CD", 0, 2, StringComparison.Ordinal)),
                                "'b' should be greater than 'C' for case-sensitive comparison");
                Assert.AreEqual(0, Math.Sign(SubstringCompare.Compare("Encyclopædia", 8, 2, "aedia", 0, 3, StringComparison.CurrentCulture)));

                Assert.AreEqual(0, Math.Sign(SubstringCompare.Compare("café", 0, 4, "cafe\u0301", 0, 5, StringComparison.CurrentCulture)));
                Assert.AreEqual(0, Math.Sign(SubstringCompare.Compare("café", 0, 4, "cafe\u0301", 0, 5, StringComparison.CurrentCultureIgnoreCase)));
                Assert.AreEqual(0, Math.Sign(SubstringCompare.Compare("café", 0, 4, "cafe\u0301", 0, 5, StringComparison.InvariantCulture)));
                Assert.AreEqual(0, Math.Sign(SubstringCompare.Compare("café", 0, 4, "cafe\u0301", 0, 5, StringComparison.InvariantCultureIgnoreCase)));
                Assert.AreEqual(1, Math.Sign(SubstringCompare.Compare("café", 0, 4, "cafe\u0301", 0, 5, StringComparison.Ordinal)));
                Assert.AreEqual(1, Math.Sign(SubstringCompare.Compare("café", 0, 4, "cafe\u0301", 0, 5, StringComparison.OrdinalIgnoreCase)));

                Assert.AreEqual(-1, Math.Sign(SubstringCompare.Compare("café", 0, 4, "CAFE\u0301", 0, 5, StringComparison.CurrentCulture)));
                Assert.AreEqual(0, Math.Sign(SubstringCompare.Compare("café", 0, 4, "CAFE\u0301", 0, 5, StringComparison.CurrentCultureIgnoreCase)));
                Assert.AreEqual(-1, Math.Sign(SubstringCompare.Compare("café", 0, 4, "CAFE\u0301", 0, 5, StringComparison.InvariantCulture)));
                Assert.AreEqual(0, Math.Sign(SubstringCompare.Compare("café", 0, 4, "CAFE\u0301", 0, 5, StringComparison.InvariantCultureIgnoreCase)));
                Assert.AreEqual(1, Math.Sign(SubstringCompare.Compare("café", 0, 4, "CAFE\u0301", 0, 5, StringComparison.Ordinal)));
                Assert.AreEqual(1, Math.Sign(SubstringCompare.Compare("café", 0, 4, "CAFE\u0301", 0, 5, StringComparison.OrdinalIgnoreCase)));

                Assert.AreEqual(0, Math.Sign(SubstringCompare.Compare("café", 2, 2, "cafe\u0301", 2, 3, StringComparison.CurrentCulture)));
                Assert.AreEqual(1, Math.Sign(SubstringCompare.Compare("café", 0, 4, "cafe\u0301", 0, 4, StringComparison.CurrentCulture)));

                Assert.AreEqual(1, Math.Sign(SubstringCompare.Compare("abc", 1, 2, "", 0, 0, StringComparison.Ordinal)));
                Assert.AreEqual(-1, Math.Sign(SubstringCompare.Compare("", 0, 0, "abc", 0, 2, StringComparison.Ordinal)));
                Assert.AreEqual(0, Math.Sign(SubstringCompare.Compare("abc", 1, 0, "", 0, 0, StringComparison.Ordinal)));
                Assert.AreEqual(0, Math.Sign(SubstringCompare.Compare("abc123", 2, 3, "ABC123", 2, 3, StringComparison.OrdinalIgnoreCase)));
            }
        }
コード例 #2
0
        private static int FindMatchLength(string source, string substring, int searchIndex, int searchLength, StringComparison comparisonType, int matchIndex)
        {
            int matchLengthMaximum = searchLength - (matchIndex - searchIndex);
            int matchLengthInitial = Math.Min(substring.Length, matchLengthMaximum);

            // Hot path: match length is same as specified substring length
            if (SubstringCompare.CompareInner(source, matchIndex, matchLengthInitial, substring, 0, substring.Length, comparisonType) == 0)
            {
                return(matchLengthInitial);
            }

            int matchLengthDecrementing = matchLengthInitial - 1;
            int matchLengthIncrementing = matchLengthInitial + 1;

            while (matchLengthDecrementing >= 0 || matchLengthIncrementing <= matchLengthMaximum)
            {
                if (matchLengthDecrementing >= 0)
                {
                    if (SubstringCompare.CompareInner(source, matchIndex, matchLengthDecrementing, substring, 0, substring.Length, comparisonType) == 0)
                    {
                        return(matchLengthDecrementing);
                    }

                    matchLengthDecrementing--;
                }

                if (matchLengthIncrementing <= matchLengthMaximum)
                {
                    if (SubstringCompare.CompareInner(source, matchIndex, matchLengthIncrementing, substring, 0, substring.Length, comparisonType) == 0)
                    {
                        return(matchLengthIncrementing);
                    }

                    matchLengthIncrementing++;
                }
            }

            // Should never happen
            return(-1);
        }
コード例 #3
0
        public void Compare_ÆbleApple()
        {
            // Sorting and String Comparison in .NET Framework
            // https://msdn.microsoft.com/en-us/goglobal/bb688122.aspx#euf

            using (new CultureSwapper(PredefinedCulture.EnglishUnitedStates))
            {
                string message = "\"Æble\" is less than \"Apple\" for the English culture.";
                Assert.AreEqual(-1, Math.Sign(SubstringCompare.Compare("Æble", 0, 4, "Apple", 0, 5, StringComparison.CurrentCulture)), message);
                Assert.AreEqual(-1, Math.Sign(SubstringCompare.Compare("Æble", 0, 4, "Apple", 0, 5, StringComparison.CurrentCultureIgnoreCase)), message);
            }

            using (new CultureSwapper(PredefinedCulture.DanishDenmark))
            {
                string message = "\"Æble\" is less than \"Apple\" for the invariant culture.";
                Assert.AreEqual(-1, Math.Sign(SubstringCompare.Compare("Æble", 0, 4, "Apple", 0, 5, StringComparison.InvariantCulture)), message);
                Assert.AreEqual(-1, Math.Sign(SubstringCompare.Compare("Æble", 0, 4, "Apple", 0, 5, StringComparison.InvariantCulture)), message);

                message = "\"Æble\" is greater than \"Apple\" for the Danish culture.";
                Assert.AreEqual(1, Math.Sign(SubstringCompare.Compare("Æble", 0, 4, "Apple", 0, 5, StringComparison.CurrentCulture)), message);
                Assert.AreEqual(1, Math.Sign(SubstringCompare.Compare("Æble", 0, 4, "Apple", 0, 5, StringComparison.CurrentCultureIgnoreCase)), message);
            };
        }