2009-06-08 5 views
5

私は、のFunc < Tに合格できるようにしたいと思いますか?私はこの(ない製品コード)のような何かをしたい例えばので...私が持っている問題は、戻り値の型が異なる場合がありますが...私はアイテムのリストをソートする方法を正確に選択することができます>:汎用Linqの注文関数ですか?

ここ
Func<POline, string> poLineOrder 
if (option) poLineOrder = poline => poline.PartNumber; 
else poLineOrder = poline => poline.LineOrder; 
var orderedLines = poLines.OrderBy(poLineOrder); 

問題は、製品型番が文字列である一方で、LineOrderはint型であり、このコードはコンパイルできないということです。私はExpression(?)を構築しなければならないと感じていますが、構文が正しいとは言えません。

(はい、私はpoline.LineOrder.ToStringを使用することによって、この問題を解決することができます( "D10")が、私はここで、より一般的な質問をしています...ありがとう!)

-mdb

答えて

5

OrderByは比較自体を定義するタイプFunc<Item, Key>のキーセレクタ機能とオプションのIComparer<Key>を期待しています。

次のヘルパーの定義が必要になります:

class FunctorComparer<T> : IComparer<T> { 
     private readonly Comparison<T> m_Comparison; 

     public FunctorComparer(Comparison<T> Comparison) { 
      this.m_Comparison = Comparison; 
     } 

     public int Compare(T x, T y) { 
      return m_Comparison(x, y); 
     } 
    } 

    static Comparison<TKey> Compare<TKey, TRes>(Func<TKey, TRes> Selector) where TRes : IComparable<TRes> { 
     return (x, y) => Selector(x).CompareTo(Selector(y)); 
    } 

今、あなたはdownvoteにコメントを

Comparison<POLine> x; 

if (option) 
    x = Compare<POLine, int>(l => l.PartNumber); 
else 
    x = Compare<POLine, string>(l => l.LineOrder); 

var res = poLines.OrderBy(i => i, new FunctorComparer<POLine>(x)); 
3

あなたはVS2008 SamplesからDynamic LINQを使用して検討する必要があります。次に、あなたが行うことができます。

var orderedLines = poLines.OrderBy(poLineOrder ? "PartNumber" : "LineOrder"); 
+0

ケアを書き込むことができますか? – tvanfosson

+0

@tvanfosson、私は別の、まだ有効なアプローチのために同じ処理を得ました。ちょうど誰かのようにdownvoteしたいと思う:( – JaredPar

関連する問題