[英]How to use lambda expressions for a function that takes a list of 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 });
而不是使用List<Func<T, string>>
使用Func<T, string>[]
並使其成為參數數組 :
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>>
。
嘗試傳入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列表中,而不僅僅是字符串。
您可以將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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.