在一列上对DataTable进行排序,与其他列无关

时间:2012-10-09 15:59:32

标签: c# datatable dataview

我创建了两列DataTable(id,name):

        DataTable table = new DataTable();
        DataColumn id = table.Columns.Add("id", typeof(int));
        id.AutoIncrement = true;
        id.AutoIncrementSeed = 1;
        id.AutoIncrementStep = 1;
        id.ReadOnly = true;                  
        table.Columns.Add("name", typeof(String));

名为DataColumn的{​​{1}}为id(例如身份)。

然后我读取一个文件,并将该文件的每一行添加为一行。

AutoIncrementing

接下来,我使用//for each line in file table.Rows.Add(null,line); 对名为DataTable的{​​{1}} DataColumn进行排序:

name

问题是,DataView列在我不希望的情况下进行排序(基本上我只是想独立于另一列对 DataView dv = table.DefaultView; dv.Sort = "name"; table = dv.ToTable(); 列进行排序)。

我找到的解决方案只有一个中间步骤,我用文件行填充id,然后对其进行排序,然后填充表格。想知道是否有更优雅(简单)的解决方案?

2 个答案:

答案 0 :(得分:2)

您可以使用Linq-To-DataTable

var orderedRows = table.AsEnumerable()
                       .OrderBy(r => r.Field<String>("name"));

或者,如果您只想要名字:

var orderedNames = orderedRows.Select(r => r.Field<String>("name"));

请务必添加using System.Linq;

修改

  

每个名称都属于一个id。但是,我只关心id,名字   键,名称后的值对已排序。例如。首先   字母数字排序的名称应为1,接下来的2,依此类推

然后,您需要在对行进行排序后添加行:

var txtLines = File.ReadLines(path)
                   .OrderBy(l => l);

foreach(String  line in txtLines)
    tables.Rows.Add(null, line);

答案 1 :(得分:0)

如果你只是担心排序后的id值,你或许应该重新生成id列。

table.Columns["id"].ReadOnly = false;
for (int i = 0; i < table.Rows.Count; i++)
{
    table.Rows[i]["id"] = i + 1;
}
table.Columns["id"].ReadOnly = true;