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

3
似乎这是一个常见需求,但我无法在任何地方找到解决方案。
我有一个方法,它将按照传递给它的参数对集合进行排序。
我想将“OrderBy”的内容传递给该方法,但无法弄清楚如何做到这一点。
我尝试了使用字符串的开关(例如,如果您传递“Name”,它将命中按名称排序的case),但这感觉很“hacky”和不必要。
我知道它类似于Func<TEntity,TResult>,但我无法完全掌握它。
伪代码:
GetOrderedCollection([NOT SURE] orderBy)
{
  return collection.OrderBy(orderBy);
}

7
为什么不查看 OrderBy 实际使用的参数,并在你的方法中使用相同类型的参数? - Chris Dunaway
5个回答

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类型(但这会破坏其排序目的,因为IEnumerable不保证顺序)。更可能的实现是返回一个List<TSource>并调用list.OrderBy(func).ToList()


1
在最泛化的形式下,你的方法需要看起来像这样:
IOrderedEnumerable<T1> GetOrderedCollection<T1, T2>(IEnumerable<T1> collection, Func<T1, T2> orderBy)
{
    return collection.OrderBy(orderBy);
}

"

T1代表列表中的项目类型,T2代表您想要按其排序的T1属性的类型。

"

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);
    }

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

展示这个想法的.NET Fiddle


-1

参数必须是 FuncAction。有关更多信息,请参见 此问题 的答案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接