如何将lambda表达式用于获取委托列表的函数

时间:2014-09-30 21:09:45

标签: c# lambda delegates

我在IList上构建一个扩展方法,以便能够输出作为列表传递给它的任何对象的指定属性,并将其输出为CSV字符串。它看起来像:

public static string OutputCSVString<T>(this IList<T> list, List<Func<T, string>> properties)
{
   foreach (var row in list)
   {
     foreach(var item in properties)
     { 
        // Do the output work, including calling item(row).
     }
      // Output new line
   }
 }

现在,我必须将此方法称为:

// Assuming I've populated List <Product> ProductList up above...

var columns = new List<Func<Product, string>>();
columns.Add(x => x.Id);
columns.Add(x => x.Name);

string s = ProductList.OutputCSVString(columns);

是否有更好的方法来传递我的lambda表达式而无需显式声明columns变量,如:

// This doesn't compile
string s = Products.OutputCSVString(new { p => p.Id , p => p.Name });

3 个答案:

答案 0 :(得分:6)

而不是使用List<Func<T, string>>使用Func<T, string>[]并将其设为parameter array

static string OutputCSVString<T>(this IList<T> list,
                                 params Func<T, string>[] properties)

然后你应该可以打电话:

string s = Products.OutputCSVString(p => p.Id , p => p.Name);

请注意,从C#6开始,您应该能够写下:

static string OutputCSVString<T>(this IList<T> list,
                                 params IEnumerable<Func<T, string>> properties)

...这意味着您仍然可以使用List<Func<T, string>>

答案 1 :(得分:5)

尝试以params数组传入

public static string OutputSVString<T>(this IList<T> list, params Func<T, string>[] properties)
{
    ...
}

这将允许您将其作为

调用
var s = Products.OutputCSVString(p => p.Id, p => p.Name);

另外,作为建议,放松函数返回对象,然后在组装零件时调用ToString()。这样,您可以传入任何属性以包含在CSV列表中,而不仅仅是字符串。

答案 2 :(得分:4)

您可以将lambdas作为数组传递,并使用params关键字:

public static string OutputCSVString<T>(this IList<T> list, params Func<T, string>[] properties)

用法:

string s = Products.OutputCSVString(p => p.Id, p => p.Name);