我有一种情况需要按从左到右的降序对包含三个小数部分的字符串列表进行排序。真正的代码是<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
应该位于底部。
我是否缺少一种特殊的排序技巧,或者是否有办法进一步分解字符串并对每个元素进行排序?
答案 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;,使您的排序按预期工作。