C#orderby string和int

时间:2016-11-11 04:41:07

标签: c# linq

我有一个包含字符串和数字的数据的列表。我必须按升序和降序排序。

        id    data
    ------------------
        1     data1@%
        2     data10
        3     data
        4     @$data
        5     data2

我获取记录并将其存储在列表" List"中。然后我按升序排序,但" data10"正在进入b / w" data1"和" data2"。以下是我的代码

var o/p = List.OrderBy(x => x.data);

expected output - data1, data2 and data10

2 个答案:

答案 0 :(得分:2)

您当前正在根据字符串值对其进行排序,字符串值将按字典值对其进行排序。在字典中,“10”将出现在“1”和“2”之间,因为这是按字母顺序排列的 - 它不会识别它正在排序数字。

真正的字母数字排序可能会非常复杂,但根据您的数据,您可能会对其进行简化。假设您的字符串“data1”,“data2”和“data10”是一致的模式,您可以执行以下操作:

var op = List.OrderBy(x => int.Parse(x.data.substring(4)));

或者,如果数字之前的值不是常数长度,则可以使用Regex将数字值拉出:

var op = List.OrderBy(x => int.Parse(Regex.Match(x.data, "\\d+").Value));

答案 1 :(得分:0)

要获得您想要的内容,您需要在order by子句中填充数字部分,例如:

var o/p = List.OrderBy(x => PadNumbers(x.Data));

其中PadNumbers可以定义为StackOverflow用户Nathan已写入here

public static string PadNumbers(string input)
{
    return Regex.Replace(input, "[0-9]+", match => match.Value.PadLeft(10, '0'));
}

这会为输入字符串中出现的任何数字(或数字)填充零,以便OrderBy看到:

data0000000001
data0000000010
data0000000002

填充仅发生在用于比较的密钥上。原始字符串(没有填充)将保留在结果中。

注意:此方法假设输入中的数字的最大位数。