Ejemplo n.º 1
0
        public void CanCompareStrings()
        {
            var comparer = new NumericStringComparer();

            Assert.AreEqual(0, comparer.Compare(null, null));
            Assert.AreEqual(0, comparer.Compare(string.Empty, string.Empty));
            Assert.AreEqual(0, comparer.Compare("", ""));
            Assert.AreEqual(0, comparer.Compare(" ", " "));
            Assert.AreEqual(0, comparer.Compare("a", "a"));
            Assert.AreEqual(0, comparer.Compare("a", "A"));

            Assert.AreEqual(-1, comparer.Compare(null, "a"));
            Assert.AreEqual(-1, comparer.Compare(string.Empty, "a"));
            Assert.AreEqual(-1, comparer.Compare("", "a"));
            Assert.AreEqual(-1, comparer.Compare(" ", "a"));
            Assert.AreEqual(-1, comparer.Compare("a", "b"));
            Assert.AreEqual(-1, comparer.Compare("A", "b"));

            Assert.AreEqual(1, comparer.Compare("a", null));
            Assert.AreEqual(1, comparer.Compare("a", string.Empty));
            Assert.AreEqual(1, comparer.Compare("a", ""));
            Assert.AreEqual(1, comparer.Compare("a", " "));
            Assert.AreEqual(1, comparer.Compare("b", "a"));
            Assert.AreEqual(1, comparer.Compare("b", "A"));
        }
Ejemplo n.º 2
0
        public void CanCompareNumbers()
        {
            var comparer = new NumericStringComparer();

            Assert.AreEqual(0, comparer.Compare("1", "1"));
            Assert.AreEqual(0, comparer.Compare("1.0", "1.0"));

            Assert.AreEqual(-1, comparer.Compare("1", "2"));
            Assert.AreEqual(-1, comparer.Compare("1.0", "1.1"));
            Assert.AreEqual(-1, comparer.Compare("1.1", "2"));
            Assert.AreEqual(-1, comparer.Compare("2", "10.0"));

            Assert.AreEqual(1, comparer.Compare("2", "1"));
            Assert.AreEqual(1, comparer.Compare("2", "1.0"));
            Assert.AreEqual(1, comparer.Compare("2", "1.1"));
            Assert.AreEqual(1, comparer.Compare("10.0", "2"));
        }
Ejemplo n.º 3
0
        public static IOrderedEnumerable <T> OrderByNatural <T>(this IEnumerable <T> ienumerable, Func <T, string> selector, NumberFormatInfo numberFormat = null)
        {
            if (ienumerable.Count() == 0)
            {
                return(ienumerable.OrderBy(x => 1));
            }

            if (numberFormat == null)
            {
                numberFormat = Thread.CurrentThread.CurrentCulture.NumberFormat;
            }

            var decimalSeparator = numberFormat.NumberDecimalSeparator;

            if (!naturalOrderRegexes.TryGetValue(decimalSeparator, out Regex naturalOrderRegex))
            {
                naturalOrderRegex = naturalOrderRegexes.Values.First();
            }

            var items = ienumerable.Select(i => new { Item = i, Text = selector(i) }).Select(s => new {
                Item        = s.Item,
                TextColumns = naturalOrderRegex.Matches(s.Text).OfType <Match>().Select(m => m.Captures[0].Value).Where(x => !string.IsNullOrEmpty(x)).ToArray()
            });

            var maxColumnCount = items.Max(l => l.TextColumns.Count());

            items = items.Select(s =>
            {
                string[] a = new string[maxColumnCount];
                s.TextColumns.CopyTo(a, 0);
                return(new { Item = s.Item, TextColumns = a });
            });

            var numbericStringComparer = new NumericStringComparer(numberFormat);

            var orderedItems = items.OrderBy(x => x.TextColumns[0], numbericStringComparer);

            for (int i = 1; i < maxColumnCount; i++)
            {
                int columnIndex = i; //avoids out of bounds exception
                orderedItems = orderedItems.ThenBy(x => x.TextColumns[columnIndex], numbericStringComparer);
            }

            return(orderedItems.Select(x => x.Item).OrderBy(x => 1));
        }
Ejemplo n.º 4
0
        public void CanCompareNumericStrings()
        {
            var comparer = new NumericStringComparer();

            Assert.AreEqual(0, comparer.Compare("1a", "1a"));
            Assert.AreEqual(0, comparer.Compare("a1", "a1"));

            Assert.AreEqual(-1, comparer.Compare("1a", "2a"));
            Assert.AreEqual(-1, comparer.Compare("1a", "10a"));
            Assert.AreEqual(-1, comparer.Compare("a1", "a2"));
            Assert.AreEqual(-1, comparer.Compare("a2", "a11"));
            Assert.AreEqual(-1, comparer.Compare("a2a", "a11a"));

            Assert.AreEqual(1, comparer.Compare("2a", "1a"));
            Assert.AreEqual(1, comparer.Compare("10a", "1a"));
            Assert.AreEqual(1, comparer.Compare("a2", "a1"));
            Assert.AreEqual(1, comparer.Compare("a11", "a2"));
            Assert.AreEqual(1, comparer.Compare("a11a", "a2a"));

            //multiple numbers
            Assert.AreEqual(-1, comparer.Compare("1a2a", "2a1a"));
            Assert.AreEqual(1, comparer.Compare("10a1a", "2a2a"));
        }