C#lambda表达式作为函数参数

时间:2011-03-22 19:30:49

标签: c# generics lambda

我最近一直在忙着研究lambda表达式,并且我有一些特定的功能,我一直想要学习,但似乎无法做出正面或反面。

假设我的代码中有以下逻辑:

List<A> foo; // assuming this is populated
string[] bar = foo.Select<A,string>(x => x.StringProperty).ToArray<string>();

现在,我想将整个操作抽象为一个处理程序方法,以便我可以这样做:

string[] bar = MakeArray<A,string>(foo, x => x.StringProperty);
int[] foobar = MakeArray<A,int>(foo, x => x.IntegerProperty);

我如何编写该方法的主体?我预见签名会像:

U[] MakeArray<T,U>( /* some lambda magic? */ ) where T : IEntity {}

但我不知道如何指定我期望lambda表达式作为方法参数,以及它如何准确地转换为方法体。

有人可以告诉我如何在上面创建MakeArray()函数吗?我很确定,一旦我看到它是如何完成的,我就可以从那里拿起它。

修改

正如评论中所指出的,MakeArray()需要引用IEnumerable<>。更新以反映这一点。

5 个答案:

答案 0 :(得分:16)

public static U[] MakeArray<T, U>(this IEnumerable<T> @enum, Func<T, U> rule)
{
    return @enum.Select(rule).ToArray();
}

答案 1 :(得分:13)

尝试以下

U[] MakeArray<T,U>(Func<T, U> projection) where T : IEntity {
  ...
}

将lambdas作为参数传递时,通常希望匹配参数为委托。在大多数情况下,您应该使用适当的Action<>Func<>值。前者用于返回lambdas,而后者用于返回值。

答案 2 :(得分:2)

您正在寻找Action<>Func<>

答案 3 :(得分:2)

您可以使用Func和Action类。查看LINQ Where函数的签名示例: http://msdn.microsoft.com/en-us/library/bb534803.aspx

答案 4 :(得分:1)

您可以创建扩展程序

public static class MakeArrayExtension
{
    public static U[] MakeArray<T, U>(this IEnumerable<T> collection, Func<T,U> func)
    {
        return collection.Select(func).ToArray();
    }
}

然后像这样使用它

List<A> foo; // assuming this is populated
string[] bar = foo.MakeArray<A,string>(x => x.StringProperty);