我有一个包含字符串和数字的数据的列表。我必须按升序和降序排序。
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
答案 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
填充仅发生在用于比较的密钥上。原始字符串(没有填充)将保留在结果中。
注意:此方法假设输入中的数字的最大位数。