对具有多个小数点的数字字符串列表进行排序

时间:2018-02-16 15:36:35

标签: c# sorting

我有一种情况需要按从左到右的降序对包含三个小数部分的字符串列表进行排序。真正的代码是<string, object>的字典,但我在这里简化了它,因为我处于同样的困境。

直接代码:

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        List<string> perlVersions = new List<string>();

        perlVersions.Add("5.26.1_32");
        perlVersions.Add("5.24.1_32");
        perlVersions.Add("5.8.1_64");
        perlVersions.Add("5.24.2_64");

        perlVersions.Sort();
        perlVersions.Reverse();
        foreach (string str in perlVersions) Console.WriteLine(str);
    }
}

输出:

5.8.1_64
5.26.1_32
5.24.2_64
5.24.1_32

现在,一切运作良好,但由于数字的第二部分低于其他部分,5.8.1_64应该位于底部。

我是否缺少一种特殊的排序技巧,或者是否有办法进一步分解字符串并对每个元素进行排序?

4 个答案:

答案 0 :(得分:2)

例如,您可以拆分string并将不同的部分视为整数,然后使用一些LINQ对它们进行排序:

static void Main()
{
    List<string> perlVersions = new List<string>();

    perlVersions.Add("5.26.1_32");
    perlVersions.Add("5.24.1_32");
    perlVersions.Add("5.8.1_64");
    perlVersions.Add("5.24.2_64");

    perlVersions = perlVersions
        .Select(x => x.Split(new char[] { '.' }))
        .Select(x =>
        {
            string[] lastParts = x[2].Split(new char[] { '_' });
            return new { a = Convert.ToInt32(x[0]), b = Convert.ToInt32(x[1]), c = Convert.ToInt32(lastParts[0]), d = Convert.ToInt32(lastParts[1]) };
        })
        .OrderBy(x => x.a).ThenBy(x => x.b).ThenBy(x => x.c).ThenBy(x => x.d)
        .Select(x => string.Format("{0}.{1}.{2}_{3}", x.a, x.b, x.c, x.d))
        .ToList();

    perlVersions.Reverse();
    foreach (string str in perlVersions) Console.WriteLine(str);
}

答案 1 :(得分:2)

试试这个

string[] separator = new string[] { "." };  
var result = perlVersions
   .OrderByDescending(s => int.Parse(s.Split(separator, StringSplitOptions.None)[1]))
   .OrderByDescending(s => int.Parse(s.Split(separator, StringSplitOptions.None)[0]))
   .ToList();

答案 2 :(得分:1)

或完全查询语法版本:

var b = from v in perlVersions
        let ii = v.Split(".")
                  .Take(2)
                  .Select(i => int.Parse(i)).ToArray()
        orderby ii[0] descending
        orderby ii[1] descending
        select v;

答案 3 :(得分:0)

您可以使用Linq进行自定义排序 为此,请将字符串拆分为&#39;。&#39;然后使用&#39; 0&#39;

扩展每个部分
List<string> perlVersions = new List<string>();

perlVersions.Add("5.26.1_32");
perlVersions.Add("5.24.1_32");
perlVersions.Add("5.8.1_64");
perlVersions.Add("5.24.2_64");

perlVersions = perlVersions
    .OrderByDescending(v => string.Concat(v.Split('.').Select(x => x.PadLeft(5, '0'))))
    .ToList();

这将(临时)转换&#34; 8&#34;至&#34; 00008&#34;和&#34; 24&#34; to&#34; 00024&#34;,使您的排序按预期工作。