C# 对包含数字数据的字符串类型的datatable的特定列进行排序
我有一个包含多列的数据表(.Net)。其中一列表示RollNo为字符串类型,但包含数字数据。例如,1、2、3、4、5、6、7、8、9、10、11、12、13、14。我尝试使用以下方法进行排序:C# 对包含数字数据的字符串类型的datatable的特定列进行排序,c#,C#,我有一个包含多列的数据表(.Net)。其中一列表示RollNo为字符串类型,但包含数字数据。例如,1、2、3、4、5、6、7、8、9、10、11、12、13、14。我尝试使用以下方法进行排序: string sql = "Select StudentID, RollNo, AdmissionID,(FirstName + Space(1) + Isnull(MiddleName,'') + Space(1) + Isnull(LastName,'')) as Name," + " Pe
string sql =
"Select StudentID, RollNo, AdmissionID,(FirstName + Space(1) + Isnull(MiddleName,'') + Space(1) + Isnull(LastName,'')) as Name," +
" PermState as State from Students where ClassId = '" + ddlClass.SelectedValue + "'" +
" order by RollNo";
DataTable dt = bl.GetDataSet(sql);
dt.DefaultView.Sort = "RollNo";
但是在排序之后,我得到的结果是1,10,11,12,13,14,2,3,4,5,6,7,8,9。
如何解决 您可以使用字符串并将其强制转换为int
:
DataTable ordered = dt.AsEnumerable()
.OrderBy(r => int.Parse(r.Field<String>("RollNo")))
.CopyToDataTable();
DataTable ordered=dt.AsEnumerable()
.OrderBy(r=>int.Parse(r.Field(“RollNo”))
.CopyToDataTable();
您需要使用System.Linq添加对System.Data.DataSetExtensions.dll
和的引用代码>
请注意,如果不需要,可以省略CopyToDataTable
,我演示它只是为了演示如何从IEnumerable
获取DataTable
如果您的数据库很大,请不要这样做。您必须在sql语句中进行“字符串到数字”的转换(这意味着在DB服务器上),这是非常昂贵的,或者必须将所有表读取到内存中,并在那里进行这种排序,这也是非常昂贵的
我将创建一个新的数字字段(列),并将此转换作为一个批处理过程进行一次。!蒂姆,谢谢你的支持。但是如果RollNo字段也包含字母数字数据和数字数据呢?这取决于格式。一般来说,Regex
是你的朋友。你可以在Linq中使用任何类型的代码。我需要样本数据来知道如何对其进行数字排序。但无论如何,这将超出这个问题的范围,因为这将是一个Regex
问题。我想问另一个问题“如何从这个字符串中得到一个数字”。
DataTable dt = GetData();
dt.Columns.Add("RollNo1", typeof(Int32));
foreach (DataRow item in dt.Rows)
{
item["RollNo1"] = item["RollNo"];
}
dt.DefaultView.Sort = "RollNo1";
dt.Columns.Remove("RollNo");
dataGridView1.DataSource = dt;