如何在保留数字值的同时按字母顺序对字符串进行排序
当某些字符串包含数字字符时,按字母顺序对字符串进行排序可能会遇到挑战。如果禁止数字转换,则需要采用替代方法来有效处理这些情况。
一种解决方案是利用区分数字和非数字值的自定义比较器。这个比较器可以传递给 OrderBy 方法来自定义排序标准。
这是使用 Enumerable.OrderBy 方法和 SemiNumericComparer 类的示例实现:
using System; using System.Collections.Generic; class Program { static void Main() { string[] things = new string[] { "paul", "bob", "lauren", "007", "90", "101" }; foreach (var thing in things.OrderBy(x => x, new SemiNumericComparer())) { Console.WriteLine(thing); } } public class SemiNumericComparer: IComparer<string> { /// <summary> /// Determine if a string is a number /// </summary> /// <param name="value">String to test</param> /// <returns>True if numeric</returns> public static bool IsNumeric(string value) { return int.TryParse(value, out _); } /// <inheritdoc /> public int Compare(string s1, string s2) { // Flags to indicate if strings are numeric var IsNumeric1 = IsNumeric(s1); var IsNumeric2 = IsNumeric(s2); // Handle numeric comparisons if (IsNumeric1 && IsNumeric2) { var i1 = Convert.ToInt32(s1); var i2 = Convert.ToInt32(s2); // Order by numerical value if (i1 > i2) { return 1; } if (i1 < i2) { return -1; } return 0; } // Handle cases where only one string is numeric if (IsNumeric1) { return -1; } if (IsNumeric2) { return 1; } // Default to alphabetical comparison return string.Compare(s1, s2, true, CultureInfo.InvariantCulture); } } }
此代码将输出字符串按以下排序顺序:
007 90 bob lauren paul 101
以上是如何在保留数字顺序的同时按字母顺序排列嵌入数字的字符串?的详细内容。更多信息请关注PHP中文网其他相关文章!