在c#中排列AlphaNumberic字符串列表

san*_*ify 0 c# sorting collections list alphanumeric

我有一个字母数字字符串列表,如下所示: v1_2014.

我的这些值范围从v1v53从一年20142016.我想他们在这个顺序排列v1_2014v53_2014,v1_2015v53_2015等等.

当我尝试对列表进行排序时,返回的顺序是

v1_2014, v1_2015,v1_2016, v10_2014, v10_2015, ... ,v2_2014,v2_2015,v2_2016,v20_2014 
Run Code Online (Sandbox Code Playgroud)

等等.

有人可以给我一个关于如何对此进行排序的想法.谢谢

Ren*_*ogt 6

你需要实现这样的自己IComparer<string>:

public class MyComparer : IComparer<String>
{
    public int Compare(string x, string y)
    {
        // your comparing logic            
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样排序你的列表:

List<string> myStrings = // wherever you get them
myString.Sort(new MyComparer());
Run Code Online (Sandbox Code Playgroud)

可能的实现MyComparer.Compare可能如下所示:

public int Compare(string x, string y)
{
    string[] xpart = x.Split('_');
    int x1 = int.Parse(xpart[0].Trim('v'));
    int x2 = int.Parse(xpart[1]);
    string[] ypart = y.Split('_');
    int y1 = int.Parse(ypart[0].Trim('v'));
    int y2 = int.Parse(ypart[1]);

    if (x2 < y2) return -1;
    if (x2 > y2) return 1;
    if (x1 < y1) return -1;
    if (x1 > y1) return 1;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这只是一个肯定可以改进的建议.首先通过一些错误处理,如果字符串不总是很好地形成.

标准Compare

  • 如果x小于y返回-1
  • 如果x大于y返回1
  • 如果x等于y返回0

根据您的要求排序,"更小","更大"和"相等".