2012-03-08 9 views
0

のソートの冗長性を削減する私のようなだけで何かだっソートする入力されたDataTableのを持っていた:(私の)LINQの一覧は

DataTable.DefaultView.Sort("sortexpression"); 

並べ替え式が文字列だったので、私はちょうどソートフィールドと方向の両方を追加することができ私が持っていたソートオプションの数にかかわらず、いくつかの行がありました。今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のケースステートメントを追加するたびに新しい並べ替えフィールド。どうしたらいいですか?

+0

なぜ 'OrderByDescending'の結果を' IOrderedEnumerable'にキャストしていますか?それはすでにそれを返します。 –

+0

こんにちは、私はそれをきれいにしました。前の混乱から二日酔いだった。 – rism

+0

'' ViewState ["SortField"] ''を制御できますか?それは型ですか?もしそうなら、あなたはそれ以外に '' string''を作ることができますか? 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

私はリフレクションについて考えました....そして、私は狂っていなければならないと思いました。もし私がT氏がそれをやる方法を知っていたら。 ; 0 – rism