c# - 使用 LINQ 进行字母数字排序

标签 c# linq sorting

我有一个 string[],其中每个元素都以某个数值结尾。

string[] partNumbers = new string[] 
{ 
    "ABC10", "ABC1","ABC2", "ABC11","ABC10", "AB1", "AB2", "Ab11" 
};

我正在尝试使用 LINQ 对上述数组进行排序,但我没有得到预期的结果。

var result = partNumbers.OrderBy(x => x);

实际结果:

AB1
Ab11
AB2
ABC1
ABC10
ABC10
ABC11
ABC2

预期结果

AB1
AB2
AB11
..

最佳答案

这是因为字符串的默认排序是标准字母数字字典(字典顺序)排序,而 ABC11 将排在 ABC2 之前,因为排序总是从左到右进行。

为了得到你想要的,你需要在你的 order by 子句中填充数字部分,比如:

 var result = partNumbers.OrderBy(x => PadNumbers(x));

其中 PadNumbers 可以定义为:

public static string PadNumbers(string input)
{
    return Regex.Replace(input, "[0-9]+", match => match.Value.PadLeft(10, '0'));
}

这会为输入字符串中出现的任何数字(或数字)填充零,以便 OrderBy 看到:

ABC0000000010
ABC0000000001
...
AB0000000011

填充只发生在用于比较的键上。原始字符串(没有填充)保留在结果中。

请注意,此方法假定输入中数字的最大位数。

关于c# - 使用 LINQ 进行字母数字排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5093842/

相关文章:

c# - 如何查找所有三个列表中存在的元素(最有效)

c# - 根据下拉选择 c# 填充 Listview

c# - LINQ group by property 作为参数

python - 为什么这是一个糟糕的冒泡排序算法?

c# - ASP.Net Core MVC UseExceptionHandler 导致空白页面

c# - 如何将 HTML 转换为纯文本

linq - 为什么在使用方法链接查询表达式 where 子句的 F# 中需要括号?

c# - Javascript 和 C# 中 var 实现的区别

arrays - 对数组中大于 n 的元素按升序排序并在 C 中降序排列

javascript - 排序数组,优先排序一些项目