2014-09-30 19 views
8

Tôi đang xây dựng một phương pháp mở rộng trên IList để có thể xuất các thuộc tính được chỉ định của bất kỳ đối tượng nào được chuyển vào danh sách dưới dạng danh sách và xuất dưới dạng CSV chuỗi. Dường như:Cách sử dụng các biểu thức lambda cho hàm có danh sách đại biểu

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 
    } 
} 

Ngay bây giờ, tôi phải gọi phương pháp này như sau:

// 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); 

Có cách nào tốt hơn để vượt qua trong các biểu thức lambda của tôi mà không cần phải dứt khoát tuyên bố các cột biến, một cái gì đó như:

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

Trả lời

6

Thay vì sử dụng một List<Func<T, string>> sử dụng một Func<T, string>[] và làm cho nó một parameter array:

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

Sau đó, bạn sẽ có thể gọi:

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

Lưu ý rằng từ C# 6, bạn sẽ có thể viết:

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

... có nghĩa là bạn vẫn có thể sử dụng nó với số List<Func<T, string>>.

4

bạn có thể vượt qua lambdas của bạn như là một mảng và sử dụng params keyword:

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

Cách sử dụng:

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

Hãy thử qua như là một mảng params

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

này sẽ cho phép bạn gọi nó như

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

Ngoài ra, như một gợi ý, nới lỏng các chức năng quay trở lại một đối tượng và sau đó gọi ToString() khi lắp ráp các bộ phận. Bằng cách này, bạn có thể chuyển vào bất kỳ thuộc tính nào để đưa vào danh sách CSV, không chỉ là chuỗi.

Các vấn đề liên quan