例如:
这个数组:
a 2
a 10
a
应该在排序后:
a
a 2
a 10
我试试这个,但它不起作用:订单错了。
...
.OrderBy(s => s.name)
.ThenBy(s => {
var stringNumber = Regex.Match(s.name, @"\d+").Value;
return string.IsNullOrEmpty(stringNumber)
? 0
: int.Parse(stringNumber);
});
答案 0 :(得分:3)
我建议明确提取标准:正则表达式中的name
和number
组:
var list = new List<string>() {
"a",
"a 4",
"b 1",
"a 2",
"a 11"
};
var result = list
.Select(item => new {
value = item,
match = Regex.Match(item, @"^(?<name>.*?)\s*(?<number>[0-9]*)$"),
})
.OrderBy(item => item.match.Groups["name"].Value)
.ThenBy(item => item.match.Groups["number"].Value.Length)
.ThenBy(item => item.match.Groups["number"].Value)
.Select(item => item.value);
测试:
Console.WriteLine(string.Join(Environment.NewLine, result));
结果:
a
a 2
a 4
a 11
b 1
答案 1 :(得分:1)
你可以尝试类似的东西;
var list = new List<string>()
{
"a ",
"a 4",
"b 1",
"a 2"
};
int value = 0;
list = list
.Select(x => new {
WholeString = x,
StringPart = x.Split(' ')[0],
IntPart = int.TryParse(x.Split(' ')[1], out value) ? value : 0
})
.OrderBy(x => x.StringPart)
.ThenBy(x => x.IntPart)
.Select(x => x.WholeString)
.ToList();
答案 2 :(得分:0)
由于您说“字母”,我假设您只想按第一个字符排序,然后按数字排序。
所以不要OrderBy
整个字符串,而只是字母:
var result = list
.OrderBy(s => s.FirstOrDefault()) // only first character
.ThenBy(s =>
{
var stringNumber = Regex.Match(s.name, @"\d+").Value;
return string.IsNullOrEmpty(stringNumber) ? 0 : int.Parse(stringNumber);
})
您的代码首先按整个字符串排序,因此ThenBy
不再有效。
答案 3 :(得分:0)
var test = new[] {"a 2", "a 10", "a"};
var sorted = test.OrderBy(s => new string(s.Where(char.IsLetter).ToArray())).ThenBy(s =>
{
var stringNumber = Regex.Match(s, @"\d+").Value;
return string.IsNullOrEmpty(stringNumber) ? 0 : int.Parse(stringNumber);
});
首先应按字母排序,然后按数字排序。