我什么时候应该使用C#Generic Func <T,Tresult>?

Pri*_*ign 2 c# generics func

我一直在看C#的通用函数委托(Func)功能.

例:

// Instantiate delegate to reference UppercaseString method
Func<string, string> convertMethod = UppercaseString;
string name = "Dakota";

// Use delegate instance to call UppercaseString method
Console.WriteLine(convertMethod(name));
Run Code Online (Sandbox Code Playgroud)

我正在努力想到一个真实的生活场景,它们可能在我自己的应用程序中很有用.所以我想我会把问题提到那里.\

我非常感谢你的想法.

Ωme*_*Man 7

假设需要为方法调用时间方法调用.由于维护原因,将定时代码放在函数内部是不可行的.

因此,通过使用Func调用,可以执行时间操作而不会干扰:

static void Time<T>(Func<T> work)
{
    var sw = Stopwatch.StartNew();
    var result = work();
    Console.WriteLine(sw.Elapsed + ": " + result);
}
Run Code Online (Sandbox Code Playgroud)

然后用我们的函数调用它来定时

Time(() => { return "Jabberwocky"; });
Run Code Online (Sandbox Code Playgroud)

结果:

 00:00:00.0000926: Jabberwocky
Run Code Online (Sandbox Code Playgroud)

下面是Funct<T,TResult>使用相同时间主题来计时regex vs string.split 的示例

var strData = "The rain in Spain";

Time((str) => { return Regex.Split(str, @"\s"); }, strData);
Time((str) => { return str.Split(); },             strData);
Run Code Online (Sandbox Code Playgroud)

这是设置

static void Time<T,S>(Func<T,S> work, T strToSplit)
{
   var sw = Stopwatch.StartNew();
   var result = work(strToSplit);
   sw.Stop();

    var joined = string.Join(", ", result as string[]);
    Console.WriteLine("{0} : {1}", sw.Elapsed, joined);

}
Run Code Online (Sandbox Code Playgroud)

结果

00:00:00.0000232 : The, rain, in, Spain
00:00:00.0000021 : The, rain, in, Spain
Run Code Online (Sandbox Code Playgroud)

更新2017年的答案.这不是一个Func但不是它的回归兄弟Action; 我发现我做了一个基本形式的登录我的类,我使用来自消费者的依赖注入,如下所示:

Action<string> ReportIt  { get; set; }

public void ReportStatus(Action<string> statusReporter)
{
    ReportIt = statusReporter;   
}
Run Code Online (Sandbox Code Playgroud)

想法是状态报告是可选的,所以稍后在代码中我检查它是否是vialble,如果是,我给出状态:

 ReportIt?.Invoke("Running - Connection initiated");
Run Code Online (Sandbox Code Playgroud)

该类的消费者称之为

 piperInstance.ReportStatus( Console.WriteLine );
Run Code Online (Sandbox Code Playgroud)

也可以表示为

 piperInstance.ReportStatus((str) => { Console.WriteLine(str); } );
Run Code Online (Sandbox Code Playgroud)