使用 LINQ 进行字母数字排序
处理包含数值的字符串时,LINQ 中的默认字母排序可能无法产生所需的结果。考虑以下示例:
string[] partNumbers = new string[] { "ABC10", "ABC1","ABC2", "ABC11","ABC10", "AB1", "AB2", "Ab11" }; var result = partNumbers.OrderBy(x => x);
预期结果将对字符串进行如下排序:
AB1 AB2 AB11 ...
但是,实际结果有所不同,因为默认字符串排序遵循字典顺序。这意味着数值从左到右进行比较,从而导致以下排序:
AB1 Ab11 AB2 ABC1 ABC10 ABC10 ABC11 ABC2
为了实现所需的字母数字排序,我们需要修改比较逻辑。我们可以用特定数量的零填充每个字符串的数字部分。这确保了数字值的比较是公平的,无论其长度如何。
public static string PadNumbers(string input) { return Regex.Replace(input, "[0-9]+", match => match.Value.PadLeft(10, '0')); } var result = partNumbers.OrderBy(x => PadNumbers(x));
使用此修改后的排序,字符串的数字部分根据其填充值进行比较,从而产生以下正确的排序:
AB1 AB2 AB11 ...
请注意,此方法假设输入中的数字有最大位数。如果数字的位数多于指定的填充,则排序可能不准确。
以上是LINQ 如何实现包含数字的字符串的正确字母数字排序?的详细内容。更多信息请关注PHP中文网其他相关文章!