如何创建一系列字母和数字的字符串组合

本文关键字:数字 组合 字符串 一系列 何创建 创建 | 更新日期: 2023-09-27 18:05:16

我有一个数据列表的集合,例如:

List<String> Dummy = new List<String>()
{
  "1001A",
  "1003A",
  "1002B",
  "1002A",
  "1003B",
  "1001B",
  "1003C",
  "1002C",
  "1001C",
};

我想把这个数据表排列成序列。主系列将关注字母表(字符串的最后一个字符),子系列将基于剩下的数字。输出如下所示:

1001A
1002A
1003A
1001B
1002B
1003B
1001C
1002C
1003C

除了上面的例子之外,我已经有了一系列数字的函数代码。谢谢你看我的文章。

如何创建一系列字母和数字的字符串组合

 var result = Dummy
              .OrderBy(p => p[p.Length - 1])
              .ThenBy(p => p.Substring(0, p.Length - 1));

这将首先按字符串的最后一个字符排序,然后按除字符串的最后一个字符以外的所有字符排序。

如果所有字符串具有相同的长度,您也可以将最后一部分保留在.ThenBy(p => p),因为字符串已经按最后一个字符排序。如果字符串长度不同,则需要像我的代码那样使用子字符串

如果字符串可能有不同的长度,则需要以下操作:

var result = data.OrderBy(d => d[d.Length - 1])
                 .ThenBy(d => int.Parse(d.Substring(0, d.Length - 1])));

你当然需要防止可能的解析异常与坏数据。

这里假设您希望"200A"出现在"1000A"之前。

版本a) (最快)

使用内置的Sort方法(就地排序),带有自定义比较委托/lambda

 dummy.Sort((s1, s2) =>
 {
      // TODO: Handle null values, now supposing s1 and s2 are not null
      // TODO: Handle variable length if needed. Supposing fixed 4+1 data 
      var result = s1[4].CompareTo(s2[4]);
      if (result != 0)
      {
          return result;
      }
      return s1.Substring(0, 4).CompareTo(s2.Substring(0, 4));
  });

要重用comparator,可以将其写成静态方法而不是内联lambda,但是在这种情况下,我建议实现IComparator。(Sort方法有一个接受IComparator的重载)

版本b):

使用LINQ:

// TODO: Handle variable length if needed, supposing fixed 4+1 data structure:
var orderedList = dummy.OrderBy(s => s[4]).ThenBy(s => s.SubString(0,4).ToList();

基于分组的解决方案:

var res = Dummy.GroupBy(str => str.Last()).OrderBy(g => g.Key)
               .SelectMany(g => g.OrderBy(str => str.Substring(0, str.Length - 1)))
               .ToList();