2012-10-09 5 views
0

는 I는 2 열 DataTable (ID, 이름) 생성 :DataTable의 정렬은

 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>으로 채우고 중간 단계를 거쳐 정렬 한 다음 테이블을 채 웁니다. 좀 더 우아한 (단순한) 솔루션이 있다면 궁금하십니까? 그냥 이름을 원하는 경우,

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

또는 :

+1

이름 만 또는 DataRow가 필요합니까? 후자의 경우 이름은 ID에 속합니다. –

+0

각'name'은'id'에 속합니다. 그러나, 나는 id, name 키, value pair _after_ name에 대해서만 신경 써야한다. 예 : 영숫자로 정렬 된 첫 번째 이름은 1이어야하고 다음 문자는 2이어야합니다. 또한 이것을 테이블 값 매개 변수로 SQL Server에 삽입 할 계획입니다. – user17753

답변

2

당신은 Linq-To-DataTable을 사용할 수 있습니다

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;