2012-03-08 2 views
0

정렬의 상세도를 감소 내가 좋아하는 뭔가했다 정렬 입력 된 DataTable을했다 :(내) Linq에 목록

DataTable.DefaultView.Sort("sortexpression"); 

정렬 expression이 문자열 이었기 때문에 난 그냥 정렬 필드와 방향을 모두 추가 할 수 내가 가지고있는 정렬 옵션의 수와 관계없이 두 줄. 이제 Linq에 임 명확 비슷한 할 수 있기 때문에 매우 잘못된 일을 함께 나는이 일을 해요 :

   this.GetSortExpressions(); 
     if ((ViewState["SortDirection"] as string) == "ASC") 
     { 
      switch (ViewState["SortField"] as string) 
      { 
       case "LKey": 
        this.SortedDetails = this.Details.OrderBy(d => d.LKey); 
        break; 
       case "MName": 
        this.SortedDetails = this.Details.OrderBy(d => d.MaterialName); 
        break; 
       case "FMSQOH": 
        this.SortedDetails = this.Details.OrderBy(d => d.FMSQOH); 
        break; 
       case "CCQOH": 
        this.SortedDetails = this.Details.OrderBy(d => d.CCQOH); 
        break; 
       case "FMSQOHVary": 
        this.SortedDetails = this.Details.OrderBy(d => d.FMSQOHVary); 
        break; 
       default: 
        this.SortedDetails = this.Details.OrderBy(d => d.LKey); 
        break; 
      } 
     } 
     else 
     { 
      switch (ViewState["SortField"] as string) 
      { 
       case "LKey": 
        this.SortedDetails = this.Details.OrderByDescending(d => d.LKey); 
        break; 
       case "MName": 
        this.SortedDetails = this.Details.OrderByDescending(d => d.MaterialName); 
        break; 
       case "FMSQOH": 
        this.SortedDetails = this.Details.OrderByDescending(d => d.FMSQOH); 
        break; 
       case "CCQOH": 
        this.SortedDetails = this.Details.OrderByDescending(d => d.CCQOH); 
        break; 
       case "FMSQOHVary": 
        this.SortedDetails = this.Details.OrderByDescending(d => d.FMSQOHVary); 
        break; 
       default: 
        this.SortedDetails = this.Details.OrderByDescending(d => d.LKey); 
        break; 
      } 
     } 

그것은 끔찍한 신입니다. 나는 모든 새로운 정렬 필드에 대해 2 * n 개의 case 문을 추가한다는 사실에 대해 우려하고 있습니다. 제발 옳은 방법은 무엇입니까?

+0

왜 'OrderByDescending'의 결과를'IOrderedEnumerable'으로 캐스팅하고 있습니까? 그것은 이미 그것을 반환합니다. –

+0

안녕하세요, 방금 청소했습니다. 이전의 혼란으로부터 숙취였습니다. – rism

+0

''ViewState [ "SortField"]''를 제어 할 수 있습니까? 그렇다면 뭔가 다른 문자열을 만들 수 있습니까? LINQ의 핵심은 유형 안전성입니다. 즉 문자열은 여러분을 멀리합니다. –

답변

1

나는이를 통과 한을 ... 내가 마지막으로는 IEnumerable 개체를 정렬하는 반사를 사용하는 일반적인 솔루션이었습니다 찾았는지 .

http://zhousanfeng.wordpress.com/2009/12/01/a-generic-comparersorter-class%E8%BD%AC/

당신이 그것을

Sorter<TestClass> sort = new Sorter<TestClass>(this.Deatils, "LKey ASC"); 
List<TestClass> sorted = sort.GetSortedList(); 

감사를 사용할 수있는 방법이 될 것입니다.

+0

이제 섹시합니다. 목록을 정렬하려면 Reflection을 사용하면됩니다. 이상하게 보입니다.) – rism

+0

예. 반사는 데이터 테이블과 같은 정렬의 편의를 달성하는 유일한 방법입니다. –

0

(안된) 정렬 수행하기 전에 ORDERBY 방법에 Func을 할당합니다

public IOrderedEnumerable<TSource> OrderFunc<TSource, TKey>(
    this IEnumerable<TSource> source, 
    Func<TSource, TKey> keySelector 
); 
OrderFunc order; 
if ((ViewState["SortDirection"] as string) == "ASC") 
    order = Enumerable.OrderBy; 
else 
    order = Enumerable.OrderByDescending; 

switch (ViewState["SortField"] as string) 
{ 
    case "LKey": 
     this.SortedDetails = order(this.Details, d => d.LKey); 
    break; 
    case "MName": 
     this.SortedDetails = order(this.Details, d => d.MaterialName); 
    break; 
    case "FMSQOH": 
     this.SortedDetails = order(this.Details, d => d.FMSQOH); 
    break; 
    case "CCQOH": 
     this.SortedDetails = order(this.Details, d => d.CCQOH); 
    break; 
    case "FMSQOHVary": 
     this.SortedDetails = order(this.Details, d => d.FMSQOHVary); 
    break; 
    default: 
     this.SortedDetails = order(this.Details, d => dLKey); 
    break; 
} 
+0

Thx, 정렬 방향을 두드리는 위대한 시작처럼 보입니다. 정렬 필드 결정을 압축하는 방법은 없습니까? – rism

+0

'ViewState [ "SortField"]'의 모든 값을 속성의 이름으로 만들 수 있다면 Reflection을 사용하여 속성을 지정할 수 있습니다. 그렇지 않다면 약간 더 어려워 질 것이지만 매핑을 수행하기 위해 상수 배열로 처리 할 수 ​​있어야합니다. –

+0

나는 Reflection에 대해 생각하고 .... 그리고 나는 내가 미쳤음에 틀림 없다고 생각했다. T 씨가 어떻게하는지 알았다면. ; 0 – rism