0

我创建了一个两列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命名id是(AutoIncrementing例如身份)。

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

//for each line in file
table.Rows.Add(null,line);

接下来,我使用 aDataTableDataColumn命名进行排序:nameDataView

        DataView dv = table.DefaultView;           
        dv.Sort = "name";
        table = dv.ToTable();

问题是,id当我不希望列排序时(基本上我只想name独立于另一列对列进行排序)。

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

4

2 回答 2

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、name 键、值对。例如,第一个按字母数字排序的名称应该是 1,接下来是 2,依此类推

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

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

foreach(String  line in txtLines)
    tables.Rows.Add(null, line);
于 2012-10-09T16:05:17.893 回答
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;
于 2012-10-09T16:39:53.693 回答