将lambda表达式作为参数传递给方法?

时间:2015-06-09 14:25:20

标签: c# linq collections parameters lambda

这似乎是一个常见的要求,但我无法在任何地方找到解决方案。

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

我想传递一个' OrderBy'的内容。该方法,但无法解决如何做到这一点。

我尝试过的事情

我已经尝试了一个带字符串的开关(例如,如果你通过'名称'它会点击case按名称命名它),但这感觉& #39;哈克'和不必要的。

我知道它类似于Func<TEntity, TResult>,但我无法解决它。

PSEUDO CODE:

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

5 个答案:

答案 0 :(得分:3)

OrderBy是一种具有以下签名的扩展方法:

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

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

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

修改 我还注意到,在您的示例代码中,您将方法声明为void,然后您尝试返回IOrderedEnumerable。 如果你想要获得有序的集合,你的方法需要至少有一个IEnumerable类型(但这会破坏它的排序目的,因为IEnumerables不保证顺序。更可能的实现是返回{{1 }并致电List<TSource>

答案 1 :(得分:1)

在其最通用的形式中,您的方法需要如下所示:

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

T1是列表中项目的类型,T2是您要订购的T1属性的类型。

答案 2 :(得分: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);
    }

答案 3 :(得分: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函数调用此函数,例如normal:

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

A .NET Fiddle展示了这个想法

答案 4 :(得分:-1)

参数必须是FuncAction。有关详细信息,请参阅this question的答案。