Sorting Strings Alphanumerically
In programming, it is often necessary to sort data based on specific criteria. One common scenario is sorting strings that may contain both alphabetic and numeric characters. However, sorting such strings naively using the default ordering may not yield the desired results.
Consider the following code snippet:
string[] things = new string[] { "105", "101", "102", "103", "90" }; foreach (var thing in things.OrderBy(x => x)) { Console.WriteLine(thing); }
This code aims to sort an array of strings numerically,但得到的输出却是不正确的:
101, 102, 103, 105, 90
Instead of sorting the strings based on their numeric value, the default ordering treats them as strings and sorts them alphabetically, resulting in the output above.
Custom Comparer to Handle Numeric Strings
To address this issue, we can define a custom comparer that can handle both alphabetic and numeric strings. The idea is to use Enumerable.OrderBy, which allows us to specify a custom comparer to control the sorting behavior.
Here is how we can implement a custom comparer using the IComparer
public class SemiNumericComparer : IComparer<string> { public int Compare(string s1, string s2) { const int S1GreaterThanS2 = 1; const int S2GreaterThanS1 = -1; var IsNumeric1 = IsNumeric(s1); var IsNumeric2 = IsNumeric(s2); if (IsNumeric1 && IsNumeric2) { var i1 = Convert.ToInt32(s1); var i2 = Convert.ToInt32(s2); if (i1 > i2) { return S1GreaterThanS2; } if (i1 < i2) { return S2GreaterThanS1; } return 0; } if (IsNumeric1) { return S2GreaterThanS1; } if (IsNumeric2) { return S1GreaterThanS2; } return string.Compare(s1, s2, true, CultureInfo.InvariantCulture); } public static bool IsNumeric(string value) { return int.TryParse(value, out _); } }
This comparer checks if both strings are numeric and sorts them accordingly. If only one string is numeric, it prioritizes the alphabetic string.
To use the custom comparer, we can modify the code as follows:
foreach (var thing in things.OrderBy(x => x, new SemiNumericComparer())) { Console.WriteLine(thing); }
Now, the output will be correctly sorted both alphabetically and numerically:
007, 90, bob, lauren, paul
By using a custom comparer, we can effectively sort strings that contain numeric characters without needing to convert them to integers, addressing the initial challenge and achieving the desired sorting behavior.
The above is the detailed content of How to Sort Alphanumeric Strings Correctly in C#?. For more information, please follow other related articles on the PHP Chinese website!