如何使用数字正确对列表<string>进行排序?</string>

时间:2012-12-18 10:26:00

标签: c# .net linq sorting

我遇到了对包含数字的列表项字符串进行排序的难度。 我希望我可以自动从最小到最大排序。 这是我的代码:

// Initialize an array to store the numbers
List<string> tab_num = new List<string>();
tab_num.Add("A.3.2.1");
tab_num.Add("A.3.3.1");
tab_num.Add("A.1.0.1");
tab_num.OrderByDescending(num => num).ToList();

为什么我的结果是假的?...

[1] A.3.2.1

[2] A.3.3.1

[3] A.1.0.1

预期结果:

[1] A.1.0.1

[2] A.3.2.1

[3] A.3.3.1

非常感谢

5 个答案:

答案 0 :(得分:6)

OrderByDescending意味着从大到小。 此外,您不会在排序后分配结果。

试试这个:

        List<string> tab_num = new List<string>();
        tab_num.Add("A.3.2.1");
        tab_num.Add("A.3.3.1");
        tab_num.Add("A.1.0.1");
        tab_num = tab_num.OrderBy(num => num).ToList();

答案 1 :(得分:2)

您应该将linq查询的结果设置为任何变量(并使用OrderBy):

List<string> tab_num = new List<string>();
tab_num.Add("A.3.2.1");
tab_num.Add("A.3.3.1");
tab_num.Add("A.1.0.1");
tab_num = tab_num.OrderBy(num => num).ToList();

tab_num.OrderBy(num => num).ToList()不对源列表执行排序,但返回排序列表。

答案 2 :(得分:2)

实际上你不需要linq,使用Sort方法:

tab_num.Sort();

但是如果你想让你的代码工作,只需结果列表分配给源列表:

tab_num = tab_num.OrderBy(x => x).ToList();

答案 3 :(得分:1)

这里的主要问题是您没有按照以下建议将结果分配给列表。

BTW:此列表不包含数字,它包含字符串,因此比较器使用字母比较器。您应该使用OrderBy而不是OrderByDescending。我建议你实现自己的比较器,因为你的字符串非常简单,当数字增长超过9时,默认比较器会给你错误的响应

答案 4 :(得分:1)

因为您按字母顺序排序。如果您想订购“从最小到最大”,您应该使用OrderBy。您需要将其解析为数字或版本:

Version v = null;
var ordered = tab_num.Select(tab => new { tab, Versionpart = tab.Substring(2) })
                     .Where(x => Version.TryParse(x.Versionpart, out v))
                     .OrderBy(x => v)
                     .Select(x => x.tab)
                     .ToList();

(假设版本始终位于tab.Substring(2)