首页 > 解决方案 > 使用演员对选择进行排序

问题描述

是否可以在 c# 中执行特殊格式的订单?我有 *.json 文件,其中包含如下数据

{
  "RECORDS": [
    {
      "ROWW": "279166",
      "ALBUMID": "3",
      "LINK": "https://...1"
    },
    {
      "ROWW": "279165",
      "ALBUMID": "1",
      "LINK": "https://...2"
    },
    {
      "ROWW": "279164",
      "ALBUMID": "2",
      "LINK": "https://...3"
    }]
}

...很多记录。而且我需要得到按 Roww 排序的 DataRows ,就像数字一样。

这就是我尝试这样做的方式:

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
//...

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public class RECORD_PHOTO
        {
            public string ROWW { get; set; }
            public string ALBUMID { get; set; }
            public string LINK { get; set; }
        }

        public class PhotoObject
        {
            public List<RECORD_PHOTO> RECORDS { get; set; }
        }
        
        public List<string[]> listForJson = new List<string[]>();
        
        public List<String> PHOTO_Rows = new List<String>();
        public List<String> PHOTO_AlbumIds = new List<String>();
        public List<String> PHOTO_Links = new List<String>();

        string JsonFileName = @"C:\temp_work\test.json"

        public DataTable dtFromJson;
    
        private void Starting()
        {
            string jsonn = File.OpenText(JsonFileName).ReadToEnd();
            var result = JsonConvert.DeserializeObject<PhotoObject>(JsonFileName);
            PHOTO_Rows = result.RECORDS.Select(p => p.ROWW).ToList();
            PHOTO_AlbumIds = result.RECORDS.Select(p => p.ALBUMID).ToList();
            PHOTO_Links = result.RECORDS.Select(p => p.LINK).ToList();
            for (int i = 0; i < PHOTO_Rows.Count; i++)
            {
                listForJson.Add(new string[] { PHOTO_Rows[i], PHOTO_AlbumIds[i], PHOTO_Links[i]});
            }
            dtFromJson = ConvertListToDataTable(VKPH);
            dtFromJson.Columns[0].ColumnName = "ROWW";
            dtFromJson.Columns[1].ColumnName = "ALBUMID";
            dtFromJson.Columns[2].ColumnName = "LINK";
            //
            DataRow[] rows = dtFromJson.Select("", "ROWW ASC");                   
        }
    }
}

但是通过“ROWW”在选择中排序就像字符串一样,所以我需要添加一些演员,比如:

DataRow[] rows = dtFromJson.Select("", "TO_NUMBER(ROWW) ASC");  

但这是错误的

标签: c#sortingdatatable

解决方案


DataColumn.Expression属性可用于将另一列添加到维护 ROWW 列的 int 版本的表中:

dtFromJson.Columns.Add("ROWWint", typeof(int)).Expression = "CONVERT([ROWW], 'System.Int32')";

然后您可以在您的选择中按此列排序

DataRow[] rows = dtFromJson.Select("", "ROWWint"); 

在行动中看到它:https ://dotnetfiddle.net/Cuh2np

--

您还可以使用 LINQ 查询行集合:

dtFromJson = dtFromJson.Cast<DataRow>().OrderBy(x => Convert.ToInt32((string)x["ROWW"])).ToArray();

推荐阅读