按字母数字顺序对字符串进行排序
在编程中,通常需要根据特定条件对数据进行排序。一种常见的情况是对可能包含字母和数字字符的字符串进行排序。但是,天真地使用默认顺序对此类字符串进行排序可能不会产生所需的结果。
考虑以下代码片段:
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
默认排序不是根据数值对字符串进行排序,而是将它们作为字符串并按字母顺序对它们进行排序,从而得到上面的输出。
处理数字字符串的自定义比较器
为了解决这个问题,我们可以定义一个自定义比较器可以处理字母和数字字符串。这个想法是使用 Enumerable.OrderBy,它允许我们指定自定义比较器来控制排序行为。
以下是我们如何使用 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 _); } }
此比较器检查两个字符串是否都是数字并相应地对它们进行排序。如果只有一个字符串是数字,则优先考虑字母字符串。
要使用自定义比较器,我们可以修改代码如下:
foreach (var thing in things.OrderBy(x => x, new SemiNumericComparer())) { Console.WriteLine(thing); }
现在,输出将被正确排序按字母顺序和数字顺序:
007, 90, bob, lauren, paul
通过使用自定义比较器,我们可以有效地对包含数字字符的字符串进行排序,而无需将它们转换为整数,解决最初的挑战并实现所需的排序行为。
以上是如何在 C# 中正确排序字母数字字符串?的详细内容。更多信息请关注PHP中文网其他相关文章!