使用 LINQ 进行字母数字排序
使用 LINQ 的默认排序机制对字母数字字符串(其中每个元素以数字值结尾)进行排序可能具有挑战性。仅依靠字母顺序排序时就会出现问题,导致意外的排序输出。
考虑以下字符串数组:
string[] partNumbers = new string[] { "ABC10", "ABC1", "ABC2", "ABC11", "ABC10", "AB1", "AB2", "Ab11" };
直接应用 LINQ 的 OrderBy 方法将产生以下排序输出:
AB1 Ab11 AB2 ABC1 ABC10 ABC10 ABC11 ABC2
这个结果与期望的结果有偏差,因为没有考虑最后的数值
解决方案
为了实现预期的排序,需要在排序键中填充字符串的数字部分。这可以使用自定义方法来完成,例如 PadNumbers,定义如下:
public static string PadNumbers(string input) { return Regex.Replace(input, "[0-9]+", match => match.Value.PadLeft(10, '0')); }
此方法将输入字符串中的任何数字序列替换为其填充的等效值。通过在 OrderBy 子句中使用此方法,可以有效地标准化数字部分以进行比较:
var result = partNumbers.OrderBy(x => PadNumbers(x));
此方法可确保同等对待数值,无论其长度如何,从而实现所需的字母数字排序:
AB1 AB2 AB11 ...
虽然此解决方案假定数字的最大位数,但它提供了一种使用以下方法进行字母数字排序的可靠方法LINQ。
以上是如何使用 LINQ 对带有数字后缀的字母数字字符串正确排序?的详细内容。更多信息请关注PHP中文网其他相关文章!