2012-12-18 29 views
-2

我遇到了难以对包含数字的列表项字符串进行排序。 我希望我能自动从最小到最大排序。 这里是我的代码:?如何正确排序列表<string>与数字?

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

非常感谢

+1

您是否尝试过使用'OrderBy'而不是'OrderByDescending'? –

+0

@Richard - >是的,我有,这是相同的结果 –

+0

@Mehdi布格纳德:和? – zerkms

回答

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(); 
+0

谢谢你我忘记了tab_num = tab_num.OrderBy(num => num).ToList();而不仅仅是tab_num.OrderBy(num => num).ToList(); –

+0

Your'e welcome :) –

+0

我不明白为什么我腐烂了我的投票,因为这...但即使如同谢谢你^^ –

1

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

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

+0

我尝试..但它是相同的结果 –

+1

@Mehdi Bugnard:结果就不能是同一 – zerkms

+2

是它可以 - 因为他不会将排序操作的结果分配给列表,因此他会输出原始列表,这在排序前后当然是相同的。 –

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)总是发现)

+0

谢谢你的权利,但我只是忘记了tab_num = tab_num.OrderBy(num => num)。 ToList();而不仅仅是tab_num.OrderBy(num => num).ToList(); –

2

应设置LINQ查询的结果,任何变量(并使用排序依据):

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()不执行源列表排序,但回报率排序列表。

+0

谢谢.i我忘记了tab_num = tab_num.OrderBy(num => num).ToList();而不仅仅是tab_num.OrderBy(num => num).ToList(); –

2

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

tab_num.Sort(); 

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

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