C# 对包含数字数据的字符串类型的datatable的特定列进行排序

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

我有一个包含多列的数据表(.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," +
  " 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;