>

3 개의 소수 부분이 포함 된 문자열 목록을 왼쪽에서 오른쪽으로 내림차순으로 정렬해야하는 상황이 있습니다. 실제 코드는 <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 를 제외하고는 모든 것이 잘 작동합니다. 숫자의 두 번째 부분이 다른 모든 부분보다 낮으므로 맨 아래에 있어야합니다.

내가 놓친 특별한 정렬 트릭이 있습니까? 아니면 문자열을 분리하여 각 개별 요소를 정렬하는 방법이 있습니까?


  • 답변 # 1

    예를 들어 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

    이것을 시도해보십시오

    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

    또는 전체 쿼리 구문 버전 :

    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

    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"로 변환하여 정렬이 예상대로 작동하도록합니다.

관련 자료

  • 이전 javascript - Lodash _ 노드없이 Lodash를 사용할 때 정의되지 않습니까?
  • 다음 access vba - 현재 버전에서 컴파일되지 않는 기존 코드를 주석 처리하면 위험합니까?