2015-06-09 108 views
3

看起来这将是一个常见的要求,但我无法在任何地方找到解决方案。将lambda表达式作为参数传递给方法?

我有一个方法,将OrderBy集合取决于传递给它的参数。

我想将'OrderBy'的内容传递给该方法,但无法解决如何执行该操作。

我已经试过

(如果你通过“名称”它会击中它的名字订购它case即)我试着用绳子开关,但这种感觉“哈克'和不必要的。

我知道这是像Func<TEntity, TResult>,但我不能相当破解它。

伪代码:

GetOrderedCollection([NOT SURE] orderBy) 
{ 
    return collection.OrderBy(orderBy); 
} 
+7

你为什么不看OrderBy实际采用的参数和您的方法使用相同的参数类型? –

回答

0

这是否满足你的要求吗?

static void Main(string[] args) {   
     var objects = new List<Test>(); 
     GetOrderedCollection(objects, x => x.Name); 
    } 

    class Test { 
     public string Name { get; set; } 
    } 

    static IEnumerable<TEntity> GetOrderedCollection<TEntity>(IEnumerable<TEntity> objects, Func<TEntity, object> orderBy) { 
     return objects.OrderBy(orderBy); 
    } 
-1

的参数,必须为一个FuncAction。有关更多信息,请参阅this question的答案。

1

在它的最一般的形式,你的方法将需要看起来像:

IOrderedEnumerable<T1> GetOrderedCollection<T1, T2>(IEnumerable<T1> collection, Func<T1, T2> orderBy) 
{ 
    return collection.OrderBy(orderBy); 
} 

T1作为项目的列表中的类型和T2是,你要订购的T1属性的类型上。

3

排序依据是一个扩展方法具有以下签名:

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

(来源:https://msdn.microsoft.com/it-it/library/bb534966%28v=vs.110%29.aspx

所以你的方法需要函数求作为它的参数,其中TSource是List类型,TKEY的是lambda返回的类型。 一个例子是:

public void Method<TSource, TKey>(List<TSource> list, Func<TSource, TKey> func) 
     { 
      ... 
      IOrderedEnumerable<TSource> orderedEnumerable = list.OrderBy(func); 
     } 

编辑: 我也注意到,在您的示例代码,你宣布你的方法无效,卜那么你试图返回IOrderedEnumerable。 如果你想获得有序的集合,你的方法需要至少有一个IEnumerable类型(但是这样做会违反排序的目的,因为IEnumerables并不保证顺序),更可能的实现是返回一个List<TSource>和叫list.OrderBy(func).ToList()

0

是的,你正在寻找一个Func<TEntity, TResult> orderingFunc。重要的是,输出(TResult)是一个IComparable使得OrderBy功能也可正常排序结果。

因此,像这样将正常工作:

public void OrderByDynamic(Func<Model, object> orderByFunc) 
{ 
    collection = collection.OrderBy(orderByFunc); //don't forget to assign the return value 
} 

你可以像正常使用lambda函数调用此:

OrderByDynamic(m => m.SortObj); //as long as this property/return value is IComparable 

A .NET Fiddle证明这种想法

相关问题