2010-08-30 75 views
1

我有一個LINQ查詢,我想要一個委託可以將「OrderBy」或「OrderByDescending」方法分配給。在「OrderBy」擴展方法的簽名是:如何構造指向擴展方法的委託

public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(
    this IEnumerable<TSource> source, 
    Func<TSource, TKey> keySelector) 

誰能告訴我的代表將是什麼樣子?

+0

你是什麼意思的「分配擴展方法委託」嗎?你的意思是用lambda表達式來指定鍵選擇器(OrderBy的第二個參數)? – 2010-08-30 13:50:33

+0

我想問題是關於動態決定調用哪個擴展方法。 – 2010-08-30 13:57:19

回答

2
public delegate IOrderedEnumerable<TSource> OrderByFunc<TSource, TKey>(
    IEnumerable<TSource> source, 
    Func<TSource, TKey> keySelector); 

用法:

public OrderByFunc<TSource, TKey> GetOrderByFunc<TSource, TKey>(bool descending) 
{ 
    if (descending) 
    { 
     return Enumerable.OrderByDescending; 
    } 
    else 
    { 
     return Enumerable.OrderBy; 
    } 
} 
+0

所以你可以使用這個:'db.Contacts.GetOrderByFunc(false)(c => c.LastName);'? – 2010-08-30 14:27:05

+0

@James Curran:是的,這是一種可能的用法。但'GetOrderByFunc'只是一個例子。我不知道OP有意與代表做什麼。 – dtb 2010-08-30 14:42:11

1

構建您的委託時,您可以忽略「這個」參數,也可以從一個實例委託吊離的建造委託。

delegate IOrderedEnumerable<TSource> OrderDelegate<TSource,TKey> 
     (IEnumerable<TSource> source, 
      Func<TSource, TKey> keySelector); 
0

您需要定義一個函數,它作爲一個參數表的類型的對象,並從要排序的對象返回值:

假設你有一個表的People,每一項都是一個Person,並且要通過LastName排序:

public static string ByLastName(Person p) 
{ 
    return p.LastName; 
} 


db.People.Where(p=>p.age > 25).OrderBy(ByLastName);