我遇到了对包含数字的列表项字符串进行排序的难度。 我希望我可以自动从最小到最大排序。 这是我的代码:
// 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
非常感谢
答案 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)
)