代码之家  ›  专栏  ›  技术社区  ›  stevieb

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

  •  3
  • stevieb  · 技术社区  · 8 年前

    我有一种情况,需要对包含三个十进制部分的字符串列表进行排序,从左到右按降序排列。真正的代码是 <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 回复  |  直到 8 年前
        1
  •  2
  •   mm8    8 年前

    例如,您可以拆分 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);
    }
    
        2
  •  2
  •   Roman Marusyk S Kotra    8 年前

    试试这个

    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();
    
        3
  •  1
  •   InBetween    8 年前

    或完全查询语法版本:

    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;
    
        4
  •  0
  •   Aleks Andreev Md. Suman Kabir    8 年前

    您可以使用Linq进行自定义排序
    为此,请按“.”拆分字符串然后用“0”扩展每个部分

    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();
    

    这将(临时)将“8”转换为“00008”,将“24”转换为“00024”,从而使您的排序按预期工作。