2009-05-18 43 views
73

Tôi đã tự hỏi nếu ai đó có thể giải thích những gì Func<int, string> là và cách nó được sử dụng với một số ví dụ rõ ràng.Giải thích về Func

Trả lời

123

Bạn có quen thuộc với các đại biểu nói chung? Tôi có một trang về delegates and events có thể giúp đỡ nếu không, mặc dù nó hướng tới giải thích sự khác biệt giữa hai.

Func<T, TResult> chỉ là một đại biểu chung chung - tìm ra ý nghĩa của nó trong bất kỳ tình huống cụ thể bằng cách thay thế các thông số loại (TTResult) với tương ứng lập luận kiểu (intstring) trong tờ khai. Tôi cũng đổi tên nó để tránh nhầm lẫn:

string ExpandedFunc(int x) 

Nói cách khác, Func<int, string> là một đại biểu đại diện cho một chức năng tham gia một cuộc tranh cãi int và trả về một string.

Func<T, TResult> thường được sử dụng trong LINQ, cho cả dự báo và vị ngữ (trong trường hợp sau, TResult luôn là bool). Ví dụ, bạn có thể sử dụng một Func<int, string> để chiếu một chuỗi các số nguyên vào một chuỗi các chuỗi. Lambda biểu thường được sử dụng trong LINQ để tạo ra các đại biểu có liên quan:

Func<int, string> projection = x => "Value=" + x; 
int[] values = { 3, 7, 10 }; 
var strings = values.Select(projection); 

foreach (string s in strings) 
{ 
    Console.WriteLine(s); 
} 

Kết quả:

Value=3 
Value=7 
Value=10 
+2

"Nói cách khác, đó là một đại biểu đại diện cho một hàm lấy tham số int và trả về một chuỗi." Chỉ để tránh nhầm lẫn cho người khác, tôi sẽ làm rõ rằng bạn đang nói về Func tại đây chứ không phải Func . Rõ ràng nếu bạn hiểu các loại chung và đại biểu nhưng đối với những người không có nó là Func mà kan ủy thác cho một hàm lấy đối số int và trả về một chuỗi. –

+0

Sẽ làm rõ khi tôi quay lại PC sau này. –

+8

Downvoters: xin vui lòng cung cấp lý do ... –

22

Đây là đại biểu nhận một tham số int và trả về giá trị loại string.

Dưới đây là một ví dụ về việc sử dụng của nó:

using System; 

class Program 
{ 
    static void Main() 
    { 
     Func<Int32, String> func = bar; 

     // now I have a delegate which 
     // I can invoke or pass to other 
     // methods. 
     func(1); 
    } 

    static String bar(Int32 value) 
    { 
     return value.ToString(); 
    } 
} 
+0

Cảm ơn andrew. Ý của bạn là viết func (1) thay vì thanh (1)? – zSynopsis

+1

Vâng tôi đã làm!Cảm ơn vì sự đúng đắn của bạn! –

33

Một Func<int, string> ăn ints và trả về chuỗi. Vì vậy, những gì ăn ints và trả về dây? Làm thế nào về điều này ...

public string IntAsString(int i) 
{ 
    return i.ToString(); 
} 

Ở đó, tôi vừa tạo ra một hàm ăn ints và trả về chuỗi. Tôi sẽ sử dụng nó như thế nào?

var lst = new List<int>() { 1, 2, 3, 4, 5 }; 
string str = String.Empty; 

foreach(int i in lst) 
{ 
    str += IntAsString(i); 
} 

// str will be "12345" 

Không quá gợi cảm, tôi biết, nhưng đó là ý tưởng đơn giản là rất nhiều thủ thuật được dựa trên. Bây giờ, hãy sử dụng một Func thay thế.

Func<int, string> fnc = IntAsString; 

foreach (int i in lst) 
{ 
    str += fnc(i); 
} 

// str will be "1234512345" assuming we have same str as before 

Thay vì gọi IntAsString trên mỗi thành viên, tôi tạo ra một tham chiếu đến nó được gọi là FNC (những tài liệu tham khảo với các phương pháp được gọi là delegates) và sử dụng mà thay thế. (Hãy nhớ fnc ăn ints và trả về chuỗi).

Ví dụ này không phải là rất gợi cảm, nhưng một tấn thông minh bạn sẽ thấy dựa trên ý tưởng đơn giản về chức năng, đại biểu và extension methods.

Một trong những mồi tốt nhất trên công cụ này tôi đã xem là here. Anh ấy có nhiều ví dụ thực tế hơn. :)

+4

Tôi thích lời giải thích này –

+0

@Therealnapster tôi thích nó quá nhưng tôi thích tên của bạn hơn. – BKSpurgeon