-1

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

// 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

非常感谢

4

5 回答 5

7

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();
于 2012-12-18T10:32:29.793 回答
4

因为您按字母顺序排序。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)

于 2012-12-18T10:34:37.470 回答
2

其实这里不需要linq,使用Sort方法:

tab_num.Sort();

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

tab_num = tab_num.OrderBy(x => x).ToList();
于 2012-12-18T10:41:44.407 回答
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()不是对源列表执行排序,而是返回排序列表。

于 2012-12-18T10:36:59.170 回答
1

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

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

于 2012-12-18T10:28:08.883 回答