2017-02-08 25 views
1

我有一个Int列表保存为字符串,我想订购它们。 我想出了以下解决方案:按字符串排序列表转换为int

sortList = sortList.OrderByDescending(x => Convert.ToInt32(x.Number)).ToList(); 

它完美,但仅当列表只有包含数字。例如,如果有一个项目是“???”排序完全失败。

后市展望:

['313', '309', '119', '49', '???'] 

结果:

['309' '49' '313' '119' '???'] 
+1

什么是'x.Number'? –

+0

x.Number是对象中的字符串。 – zperee

+0

您的输出显示类似字符串的内容,但字符串没有'Number'属性。如果你有对象,那么输出应该看起来像'[{Number:“309”},{Number:“49”} ...]' –

回答

4

所以你需要使用int.TryParse()并返回无效的字符串低值:

sortList = sortList.OrderByDescending(x => 
    { 
     int i; 
     return int.TryParse(x.Number, out i) ? i : int.MinValue; 
    }); 

我用OrderByDescending,而不是OrderBy作为你展示的预期结果按降序排列。

+2

他想要“???”最后,我会改变MinValue MaxValue –

+0

@MaksimSimkin他的期望是下令, –

+0

是的,你的权利,对不起:) –

3

C# 7,你可以在此同时仍使用TryParse()使用out-variables减少到只有一行,:

sortList = sortList.OrderBy(x => Int32.TryParse(x.Number, out var i) ? i : Int32.MinValue).ToList(); 
+1

@HimBromBeere:但你不需要再声明它们。 https://docs.microsoft.com/en-us/dotnet/articles/csharp/csharp-7#out-variables一个很大的改进,因为目前您需要修改LINQ查询中的(本地)变量,这是不恰当的做法 –