2013-05-29 4 views
3

나는 아래와 같이 보이는 DataTable을 가지고 있습니다.DataTable을 그룹화하고 필드별로 각 그룹을 정렬하는 방법은 무엇입니까?

| ItemName | ItemNo | ItemValue 
    A   2   3,1 
    B   1   2,2 
    C   3   1,5 
    A   2   2,0 
    B   1   1,4 
    A   2   2,7 
    C   3   1,3 
    C   3   2,1 
    B   1   1,9 

나는 ItemValue에 의해 정렬 각 분류 그룹 내 다음 ItemName으로 DataTable을 위 그룹에 원하는 먼저 ItemNo하여 이러한 그룹을 정렬 할 수 있습니다.

어떻게하면됩니까?

참고 : 정렬 후, 나는 아래 테이블을 원한다;

| ItemName | ItemNo | ItemValue 
    B   1   1,4 
    B   1   1,9 
    B   1   2,2 
    A   2   2,0 
    A   2   2,7 
    A   2   3,1 
    C   3   1,3 
    C   3   1,5 
    C   3   2,1 

답변

8
table = table.AsEnumerable() 
      .GroupBy(r => r.Field<string>("ItemName")) 
      .OrderBy(g => g.Max(r => r.Field<int>("ItemNo"))) 
      .SelectMany(g => g.OrderBy(r => r.Field<double>("ItemValue"))) 
      .CopyToDataTable(); 

나는 ItemValue에 의해, 내부의 다음 정렬 각 분류 그룹을 항목 이름하여 DataTable을 위 그룹에 원하는 먼저 ITEMNO하여 이러한 그룹을 정렬 할 수 있습니다.

그러나 ItemNo은 goup 키의 일부가 아닌, 그래서 (샘플 데이터와 반대) 값은 각 그룹에서 다른 경우 어떻게 ITEMNO으로 그룹을 정렬 할 수 있습니까? 최대/최소/평균값 기준? 나는 하나의 접근법을 보여주기 위해 Max을 사용했다.

편집 그래서 실제로 두 열 그때 내가 모두 열이 포함 키를 그룹화 같은 익명 형식을 사용, 같은 키에 속하는, 다음도 분명있다 : 당신의 좋은 대답 :)에 대한

table = table.AsEnumerable() 
      .GroupBy(r => new 
      { 
       ItemName = r.Field<string>("ItemName"), 
       ItemNo = r.Field<int>("ItemNo") 
      }) 
      .OrderBy(g => g.Key.ItemNo) 
      .SelectMany(g => g.OrderBy(r => r.Field<double>("ItemValue"))) 
      .CopyToDataTable(); 
+1

감사합니다 –

+0

각 그룹에는 고유 한 번호가 있습니다. 그래서 그룹의 ItemNo = 2, B 그룹의 ItemNo = 1, C 그룹의 ItemNo = 3입니다. 그룹화 후 테이블은 다음 항목별로 정렬되어야합니다. 아니요 –

+0

@MehmetInce : 실제로 두 열은 모두 동일한 키에 속합니다. 그런 다음 익명 유형 '.GroupBy (r => new { ItemName = r.Field ("ItemName"), ItemNo = r.Field ("ItemNo") })를 두 그룹의 그룹화 키로 사용하면 더 명확합니다. OrderBy (g => g.Key.ItemNo)'. 내 대답을 편집했습니다. –

3

아래와 같이 SortYourDataTable 메서드를 정의 할 수 있습니다.

public static DataTable SortYourDataTable(DataTable dt, string column) 
{ 
    dt.DefaultView.Sort = column; 
    dt = dt.DefaultView.ToTable(); 
    return dt; 
} 

그런 다음 호출하십시오.

SortYourDataTable(SortYourDataTable(SortYourDataTable(dt, "ItemNo"), "ItemName"), "ItemValue"); 
관련 문제