linq - 字符串列表 - 仅按字母顺序,然后按数字排序

时间:2017-12-21 07:13:44

标签: c# linq

例如:

这个数组:

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);
 });

4 个答案:

答案 0 :(得分:3)

我建议明确提取标准:正则表达式中的namenumber组:

  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);
});

首先应按字母排序,然后按数字排序。