Int.Parse和排序

时间:2013-02-22 10:48:15

标签: c#

我有以下代码..

var strings = new[] { 
"FD1","FD5","FD10","FD102","FD105","FD10","FD32","FD80", "FD31", "FD21", "FDnon"
};
        strings = strings.Select(str => new
        {
            str,
            num = int.Parse(String.Concat(str.Trim('F', 'D'))),
        })
        .OrderBy(x => x.num)
        .Select(x => x.str)
        .ToArray();

但是当它到达“FDnon”时失败,因为它没有数字,

如何使用“FDnon”排序在顶部?

5 个答案:

答案 0 :(得分:1)

如果您想要自定义订购,请提供自定义的SortMethod

var sorted = strings
.OrderBy(SpecialSort)
.ToList();

public static int SpecialSort(string value)
{
    int sortOrder = 0;
    string numberPart = value.Trim('F', 'D');
    int.TryParse(numberPart, out sortOrder);
    return sortOrder;
}

编辑:更改了解决方案,以便对字符串中的数字进行排序。

答案 1 :(得分:1)

var result = strings.OrderBy(x =>
                         {
                             int y = int.MinValue;
                             int.TryParse(x.Substring(2), out y);

                             return y;
                         });

答案 2 :(得分:0)

如果你希望FDnon出现在顶部,你可以使用类似的东西:

strings = strings.Select(str => new
    {
        str,
        num = str=="FDnon" ? Int32.MaxValue : Int32.Parse(String.Concat(str.Trim('F', 'D')))
    })
    .OrderBy(x => x.num)
    .Select(x => x.str)
    .ToArray();

此代码只是跳过FDnon转换。如果您想允许其他值,您应该更具体地了解您要接受的内容。

答案 3 :(得分:0)

您需要一个更复杂的解析,将FDnon转换为最后排序的整数值(在这种情况下Int32.MaxValue会这样做。)

类似的东西:

var res = strings.Select(s => {
            var numPart = s.Trim('F', 'D');
            var i;
            if (!Int32.TryParse(numPart, out i)) {
               i = Int32.MaxValue;
            }
            return new {
              str = s,
              num = i
            };
          }.OrderBy …

答案 4 :(得分:0)

如果字符串始终以两个字母开头,您也可以使用Substring(2)。要检查是否有数字部分,您可以使用Enumerable.All(Char.IsDigit)(假设所有字符都是前两个lewtters之后的数字):

strings = strings.Select(str => new
{
    str,
    num = str.Substring(2).All(Char.IsDigit) ? int.Parse(str.Substring(2)) : int.MinValue
})
.OrderBy(x => x.num)
.Select(x => x.str)
.ToArray();

DEMO