带有前缀和后缀的字母数字字符串排序

时间:2019-05-22 06:17:22

标签: c#

我有一个数组的字母数字字符串,在字符串末尾也包含一些字符。问题是我只能排序到最后一个字符之前。 这是我的数组

string[] ar = new string[] { "DV00154A", "DV00144A", "DV00111B", "DV00100A", "DV00199B", "DV00001A" };

我尝试了一些方法,但是排序数组跳过了最后一个字符的排序。这是我尝试过的方法之一。

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

public static void Main(string[] args)
{
  string[] ar = new string[] { "DV00154A", "DV00144A", "DV00111B", "DV00100A", 
  "DV00199B", "DV00001A" };
  var result = ar.OrderBy(x => ArraySort(x));
  Console.WriteLine(string.Join(",",result.ToArray()));
 }

返回以下输出

DV00001A,DV00100A,DV00111B,DV00144A,DV00154A,DV00199B

但是我需要的输出应该是这样

DV00001A,DV00100A,DV00144A,DV00154A,DV00111B,DV00199B

1 个答案:

答案 0 :(得分:0)

该解决方案如何?

public static string ArraySort(string input)
{
    return $"{input.Substring(0, 2)}{input.Substring(7, 1)}{input.Substring(2, 5)}";
}

public static void Main(string[] args)
{
    string[] ar = new string[] { "DV00154A", "DV00144A", "DV00111B", "DV00100A", "DV00199B", "DV00001A" };
    Array.Sort(ar, (a, b) => StringComparer.OrdinalIgnoreCase.Compare(ArraySort(a), ArraySort(b)));
    Console.WriteLine(string.Join(",", ar));
    Console.ReadKey();
}

ArraySort方法以可排序的格式重新排列值:DV00154A-> DVA00154。该值由Array.Sort比较器方法使用。

ar数组是就地排序的唯一缺点...

编辑:

我找到了一个更好的解决方案:只需将ArraySort方法与您的Main方法一起使用。应该工作正常。 :)而且不会影响您的ar数组。

编辑2:

仅修复了我的ArraySort方法中的一个小错误。 (抱歉)

修改3:

如果您可以忽略DV前缀,则可以将ArraySort方法更改为此:

public static string ArraySort(string input)
{
    return $"{input.Substring(7, 1)}{input.Substring(2, 5)}";
}

逻辑不太复杂,结果值更短。它应该具有(边际)更好的性能。