簡體   English   中英

如何將lambda表達式用於獲取委托列表的函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM