2009-06-08 81 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); 

這裏的問題是,雖然PartNumber是一個字符串,LineOrder是一個int,並且此代碼不能編譯。我有一種感覺,我將不得不建立一個表達式(?),但我似乎無法得到正確的語法。

(是的,我可以解決這個問題,通過使用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)); 
    } 

現在你可以寫

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

護理的downvote評論? – tvanfosson 2009-06-08 19:21:23