2012-10-09 23 views
0

我創建一個兩列DataTable(ID,姓名):數據表

 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命名idAutoIncrementing(例如身份)。

然後我讀取一個文件,並將該文件的每一行添加爲一行。

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

問題在於,id列被排序的時候,我寧願它不會(基本上我只是想排序:

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

接下來,我用DataView排序的DataColumn命名nameDataTable獨立於另一列的name列)。

我唯一可以找到的解決方案是有一箇中間步驟,我用文件行填充List<string>,然後對其進行排序,然後填充表格。想知道是否有更優雅(簡單)的解決方案?

+1

您只需要名稱或DataRows?如果是後者,則名稱屬於ID。 –

+0

每個'name'都屬於'id'。不過,我只關心ID,名稱鍵,值對_after_ name已被排序。例如。第一個按字母順序排序的名稱應該是1,然後是下一個2,依此類推。我也應該說我打算將這個值作爲Table-Valued參數插入到SQL Server中。 – user17753

回答

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); 
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;