2010-08-30 78 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);