在对字符串数组中的数值进行优先级排序的同时保持字母顺序
按字母顺序对字符串进行排序是一项标准任务,但是如何处理字符串的场景在保持数字顺序的同时也表示数字?这是解决此挑战的解决方案。
请考虑以下代码:
string[] things= new string[] { "105", "101", "102", "103", "90" }; foreach (var thing in things.OrderBy(x => x)) { Console.WriteLine(thing); }
此代码尝试按字母顺序对数字字符串数组进行排序,但输出不符合预期:
101, 102, 103, 105, 90
要达到预期的输出:
90, 101, 102, 103, 105
你需要传递一个自定义的比较器进入 OrderBy。 Enumerable.OrderBy 允许您指定用于排序的自定义比较器。
这是使用 SemiNumericComparer 的实现:
string[] things = new string[] { "paul", "bob", "lauren", "007", "90" }; foreach (var thing in things.OrderBy(x => x, new SemiNumericComparer())) { Console.WriteLine(thing); }
SemiNumericComparer 类定义了一个方法来确定字符串是否为数字,并提供比较方法:
public class SemiNumericComparer: IComparer<string> { /// <summary> /// Method to 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) { 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); } }
当应用于字符串数组时, SemiNumericComparer 首先按字母顺序排序字符串,然后按数值排序,提供所需的输出。
以上是如何按字母顺序对字符串数组进行排序,同时对数值进行优先级排序?的详细内容。更多信息请关注PHP中文网其他相关文章!