通过自定义比较按字母顺序和数字对字符串进行排序
此问题提出了在考虑数值的同时按字母顺序对字符串数字数组进行排序的挑战。为此,必须实现自定义比较器来覆盖默认的字符串比较。
实现详细信息
下面的代码演示了如何实现此排序:
using System; using System.Collections.Generic; using System.Linq; namespace StringSort { class Program { static void Main(string[] args) { // Input array of string numbers string[] things = new string[] { "105", "101", "102", "103", "90" }; // Sort using custom comparer IEnumerable<string> sortedThings = things.OrderBy(x => x, new SemiNumericComparer()); // Print sorted array foreach (var thing in sortedThings) { Console.WriteLine(thing); } } public class SemiNumericComparer : IComparer<string> { // Check if a string is numeric public bool IsNumeric(string value) { return int.TryParse(value, out _); } // Compare two strings public int Compare(string s1, string s2) { const int S1GreaterThanS2 = 1; const int S2GreaterThanS1 = -1; // Check if both strings are numeric var IsNumeric1 = IsNumeric(s1); var IsNumeric2 = IsNumeric(s2); if (IsNumeric1 && IsNumeric2) { int i1 = Convert.ToInt32(s1); int i2 = Convert.ToInt32(s2); return i1.CompareTo(i2); } // If one string is numeric and the other is not, consider the numeric string greater if (IsNumeric1) return S2GreaterThanS1; if (IsNumeric2) return S1GreaterThanS2; // Otherwise, perform a case-insensitive alphabetical comparison return string.Compare(s1, s2, true, CultureInfo.InvariantCulture); } } } }
自定义比较器Logic
SemiNumericComparer 类定义字符串的比较逻辑。它首先使用 IsNumeric 方法检查两个字符串是否都是数字。如果两者都是数字,则会对它们进行数字比较。如果只有一个字符串是数字,则认为该数字字符串更大。对于非数字字符串,它执行不区分大小写的字母比较。
将此比较器与 Enumerable.OrderBy 一起使用时,字符串数字数组将首先按数字值排序,然后按字母顺序对非数字字符串排序。上面示例的输出将是:
90 101 102 103 105
以上是如何使用 C# 中的自定义比较器按字母顺序和数字对字符串进行排序?的详细内容。更多信息请关注PHP中文网其他相关文章!