如何按升序对DataTable中的日期进行排序?

3

我的C#代码将股票行情下载到DataTable对象中。数据以第一列的降序日期形式出现。我想按升序日期对此表进行排序。我尝试了以下方法:

table.DefaultView.Sort = "Date";

将表格按字符串类型排序,例如:"1/1/1994"、"1/1/1995"、"1/1/1996",而不是期望的"1/1/1994"、"1/2/1994"、"1/3/1994"。

现在,以下操作会引发InvalidCastException。

var newTable = table.AsEnumerable().OrderBy(r => r.Field<DateTime>("Date")).CopyToDataTable();

注意:此排序是在返回一个 DataTable 对象的方法中进行的。
[更新] 以下是我如何从一个列表中创建和填充表格,其中每个条目的格式为例如:"1/1/1994,21.01,22,21,21.01,23131,21.01"。
        List<string> list = Downloaders.DownloadContentToList(symbol);

        DataTable table = new DataTable(symbol);
        table.Columns.Add("Date");
        table.Columns.Add("Open");
        table.Columns.Add("High");
        table.Columns.Add("Low");
        table.Columns.Add("Close");
        table.Columns.Add("Volume");
        table.Columns.Add("Adj Close");

            for (int i = 0; i < list.Count; i++)
        {
            string[] cols = list[i].Split(',');

            DateTime date = Convert.ToDateTime(cols[0]);
            double open = Convert.ToDouble(cols[1]);
            double high = Convert.ToDouble(cols[2]);
            double low = Convert.ToDouble(cols[3]);
            double close = Convert.ToDouble(cols[4]);
            double volume = Convert.ToDouble(cols[5]);
            double adjClose = Convert.ToDouble(cols[6]);
            table.Rows.Add(date, open, high, low, close, volume, adjClose);
        }

日期列是DateTime类型吗?如果它是字符串类型,那么预计会出现异常。 - Steve
我们需要查看你创建并填充“DataTable”的代码部分,以便分析为什么无法按日期排序。正如@Steve所述,如果列的DataType未设置为date,则排序算法将假定您要按照该列的DataType的正确排序顺序进行排序(很可能是字符串)。 - M463
我已更新问题并附带了有关 DataTable 的信息,感谢您的帮助。 - olhodolago
3个回答

5
在创建表格时,应该添加一个名为“date”的列:
table.Columns.Add("Date", typeof(DateTime));

然后:
table.DefaultView.Sort = "Date desc";

2
创建数据表时,即使它是字符串格式,也必须指定其为日期格式:
table.Columns.Add("dateValue", typeof(DateTime?));

    var orderedRows = from row in dt.AsEnumerable()
                      orderby  row.Field<DateTime>("Date")
                      select row; 
    DataTable tblOrdered = orderedRows.CopyToDataTable();

或者:

var orderedRows = from row in dt.AsEnumerable()
                      let date = DateTime.Parse(row.Field<string>("Date"), CultureInfo.InvariantCulture)
                      orderby date 
                      select row;

这是一个类似的问题,但我认为答案也适用于你。

"table.Columns.Add("dateValue", typeof(DateTime?))" 给我返回了 "DataSet 不支持 System.Nullable<>",正确的应该是 "table.Columns.Add("dateValue", typeof(DateTime))"。 - olhodolago

1

"Date"列应该被添加如下:

table.Columns.Add("Date", typeof(DateTime));

而不是
table.Columns.Add("Date");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接