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")); }
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")); }
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)); }
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")); }