C#lambda表达式作为函数参数
我最近一直在忙着研究lambda表达式,并且我有一些特定的function,我一直想学习,但似乎无法做出正面或反面。
假设我的代码中有以下逻辑:
List foo; // assuming this is populated string[] bar = foo.Select(x => x.StringProperty).ToArray();
现在,我想将整个操作抽象为一个处理程序方法,以便我可以这样做:
string[] bar = MakeArray(foo, x => x.StringProperty); int[] foobar = MakeArray(foo, x => x.IntegerProperty);
我将如何编写该方法的主体? 我预见签名就像:
U[] MakeArray( /* some lambda magic? */ ) where T : IEntity {}
但我不知道如何指定我期望lambda表达式作为方法参数,以及它如何准确转换为方法体。
任何人都可以告诉我如何创建上面的MakeArray()
函数? 我很确定,一旦我看到它是如何完成的,我就可以从那里拿起它。
编辑
正如评论中指出的那样, MakeArray()
需要对IEnumerable
的引用。 更新以反映这一点。
public static U[] MakeArray(this IEnumerable @enum, Func rule) { return @enum.Select(rule).ToArray(); }
请尝试以下方法
U[] MakeArray(Func projection) where T : IEntity { ... }
将lambdas作为参数传递时,通常希望匹配参数为委托。 在大多数情况下,您应该使用适当的Action<>
或Func<>
值。 前者用于返回lambdas的void,后者用于返回值的lambdas。
你正在寻找Action<>
和Func<>
。
您可以使用Func和Action类。 查看LINQ Where函数的签名示例: http : //msdn.microsoft.com/en-us/library/bb534803.aspx
您可以创建扩展名
public static class MakeArrayExtension { public static U[] MakeArray(this IEnumerable collection, Func func) { return collection.Select(func).ToArray(); } }
然后像这样使用它
List foo; // assuming this is populated string[] bar = foo.MakeArray(x => x.StringProperty);