【问题标题】:Sort a DataTable on converted value of a column根据列的转换值对 DataTable 进行排序
【发布时间】:2015-07-17 23:46:18
【问题描述】:

我正在使用 C# 开发一个 ASP.Net 应用程序。我需要根据名为“Price”的列的转换值对 DataTable 中的行进行排序,出于某种未知原因,这是 DataTable 中的字符串类型列。

下面的代码 sn-p 会给我一个按价格列的字符串值排序的数据表,但我正在寻找的是按价格列的小数值排序。

问题:在这段代码 sn-p 中,Select 方法的第二个参数需要使用什么表达式?目前,该参数的值为Price asc

DataTable dt = GetData();
dt = dt.Select( null, "Price asc", DataViewRowState.CurrentRows).CopytoDataTable();

更新 1

我能够对上面的代码-sn-p 进行最小的更改,但使用价格的十进制值进行排序。我使用Convert 函数将Price 列的字符串值转换为Decimal 类型。 DataTable 表达式支持此函数。这个函数的详细信息可以在这个位置找到:https://msdn.microsoft.com/en-us/library/system.data.datacolumn.expression(v=vs.110).aspx

有效的代码如下。

DataTable dt = GetData();
//define an expression column for decimal version of Price
dt1.Columns("Price1").Expression = "Convert(Price, 'System.Decimal')"
dt = dt.Select( null, "Price1 asc", DataViewRowState.CurrentRows).CopytoDataTable();

转换函数示例用于将名为“total”的列中的值转换为小数类型如下。 convert 函数的第二个参数必须是要转换成的 .Net 类型的名称,并且应该用单引号括起来。

myDataColumn.Expression="Convert(total, 'System.Int32')"

【问题讨论】:

  • 我尝试使用 Convert inside expression 完全按照您在我回答之前在这里编写的方式转换 DataTable 中的列,但它不起作用。 “找不到列转换(价格”
  • @msmolcic,我会再次检查并通知您。感谢您指出。
  • @msmolcic,我在 UPDATE1 下编辑了代码,我已经验证它可以工作。这个想法是使用DataTable表达式创建一个计算列,然后对计算列进行排序。
  • 添加另一列以插入转换为十进制的值并按新列排序比我的 LINQ 解决方案更加混乱,但哦,这是您的选择。

标签: c# sorting datatable


【解决方案1】:

我最好的想法是将这些值转换为十进制,对它们进行排序并将它们复制回表格:

dt = dt.Rows.Cast<DataRow>().OrderBy(row => Convert.ToDecimal(row["Price"])).CopyToDataTable();

【讨论】:

  • 我无法进行更改,因为我正在维护现有的代码库。在我的情况下,可能有一些演员功能。否则我将不得不使用 LINQ。
猜你喜欢
  • 2017-11-25
  • 2013-04-22
  • 2015-01-05
  • 1970-01-01
  • 2023-04-06
  • 2020-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多