首页 > 解决方案 > C# Json:对字母数字字符串进行排序

问题描述

我试图通过删除第一个字符'A'来对 fieldName 进行排序,但它仍然没有正确排序。

static void Main(string[] args)
{
    string _json = "{'Information': [{'FieldName': 'A104','Draft': 'Unknown'},{'FieldName': 'A02','Draft': 'Unknown'},{'FieldName': 'A101','Draft': 'Unknown'},{'FieldName': 'A03','Draft': 'Unknown'}],'OtherInfo': []}";
    var jObj = JsonConvert.DeserializeObject<Informat>(_json);
    var test1 = jObj.Information.OrderByDescending(x => x.FieldName.Remove(0,1));
    var sortedJson = JsonConvert.SerializeObject(test1);
    jObj.PMRejectedReasons = sortedPMRejectedReasonsJson.ToArray();

    //below too not working
    var sortedRMASystemReasonsJson =
        from t in jObj.Information
        orderby t.FieldName.Remove(0,1) descending
        select t;
}

JSON:

{
   "Information":[
      {
         "FieldName":"A104",
         "Draft":"Unknown"
      },
      {
         "FieldName":"A02",
         "Draft":"Unknown"
      },
      {
         "FieldName":"A101",
         "Draft":"Unknown"
      },
      {
         "FieldName":"A03",
         "Draft":"Unknown"
      }
   ],
   "OtherInfo":[
      
   ]
}

标签: c#jsonsorting

解决方案


可能您期望的是数字顺序。即使在删除“A”之后,剩余的字符串也将按词法顺序排序。0即,首先出现所有以then开头的数字1,等等,无论它们有多少位数。

您必须将数字转换为数值(例如intlongdecimal)才能获得数字顺序。

var test1 = jObj.Information
    .OrderByDescending(x => Int64.Parse(x.FieldName.Remove(0,1)));

或者

var sortedRMASystemReasonsJson =
   from t in jObj.Information
   orderby Int64.Parse(t.FieldName.Remove(0,1)) descending
   select t;

如果您在 .NET Core 项目中使用 C# 8.0 或更高版本,您也可以编写t.FieldName[1..]而不是t.FieldName.Remove(0,1).


推荐阅读