我有一个 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/