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

时间:2016-05-20 14:18:35

标签: c# list sorting collections alphanumeric

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

v1年到v53,我的这些值从20142016不等。我想按照以下顺序排列v1_2014v53_2014v1_2015v53_2015等等。

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

v1_2014, v1_2015,v1_2016, v10_2014, v10_2015, ... ,v2_2014,v2_2015,v2_2016,v20_2014 

等等。

有人可以告诉我如何对此进行排序。 感谢

3 个答案:

答案 0 :(得分:6)

您需要实现自己的IComparer<string>

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

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

List<string> myStrings = // wherever you get them
myString.Sort(new MyComparer());

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

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

Compare的标准是

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

&#34;较小&#34;,&#34;更大&#34;和#34;平等&#34;根据您的要求排序。

答案 1 :(得分:1)

如果所有版本都有这样的模板“V {number} _ {Year}”,您可以使用此代码

List<string> Versions = new List<string>();
// Fill Versions
Versions = Versions.OrderBy(V => Convert.ToInt32(V.Split('_')[1]))
        .ThenBy(V => Convert.ToInt32(V.Split('_')[0].Remove(0, 1)))
        .ToList();

答案 2 :(得分:0)

您也可以使用LINQ查询对此进行排序,因此您需要拆分值并将标记解析为extension.vsixmanifest

int

但总的来说,创建一个包含int version = 0, year = 0; IEnumerable<string> orderedByYearAndVersion = values .Select(v => new { value = v, tokens = v.Split('_') }) .Where(x => x.tokens.Length == 2 && x.tokens[0].StartsWith("v") && int.TryParse(x.tokens[0].Substring(1), out version) && int.TryParse(x.tokens[1], out year)) .Select(x => new { x.value, version, year }) .OrderBy(x => x.year) .ThenBy(x => x.version) .Select(x => x.value); int Year等属性的自定义类会更好。然后,您可以实施int VersionIComparable等方法会自动生效。