【问题标题】:How to replace Action delegate with a func delegate return a value to function如何用 func 委托替换 Action 委托,将值返回给函数
【发布时间】:2020-01-27 18:17:01
【问题描述】:

我有一个名为 CompleteDownload 的函数,它接受 int 参数,我想在这个函数中打印百分比

public void CompletedDownload(int percentage)
{    
    Console.WriteLine(mID+":"+percentage+"% Loading is Completed");
 }

我有一个功能:

public void LoadProcedure(int n,Action<int> inAction)
    {   
      // LoadingDisplay loadingDisplay=new LoadingDisplay(n);
        for(int i=0;i<=n;i++)
        {
            if(i==n/4)
            {   

                inAction(i);


            }
        }
     }

我想使用 func 委托将 i 值返回给 Completeddownload 函数,方法是什么

Loading loading=new Loading();
loading.LoadProcedure(100,display.CompletedDownLoad);

还帮助我主要如何指定它。

【问题讨论】:

  • 您能否请edit 澄清为什么不能使用Func&lt;…&gt;
  • 如何在上面的上下文中使用它先生你可以指定它

标签: c# c#-4.0 delegates c#-3.0 c#-2.0


【解决方案1】:

在您的示例中,您似乎不需要对响应执行任何操作。因此,您无需尝试从 CompletedDownload 方法返回值,而是可以处理您的操作并在满足条件时简单地中断循环。

public void LoadProcedure(int n, Action<int> inAction)
{
    // LoadingDisplay loadingDisplay=new LoadingDisplay(n);
    for (int i = 0; i <= n; i++)
    {
        if (i == n / 4)
        {
            inAction(i);
            break;
        }
    }
}

这将运行您的操作,退出循环并返回调用方法。

如果您绝对需要返回触发操作的输入变量,只需将LoadProcedure 的返回类型从 void 更改为 int 并返回结果。

var result = loading.LoadProcedure(100,display.CompletedDownLoad);

public int LoadProcedure(int n, Action<int> inAction)
{
    // LoadingDisplay loadingDisplay=new LoadingDisplay(n);
    for (int i = 0; i <= n; i++)
    {
        if (i == n / 4)
        {
            inAction(i);
            return i;
        }
    }
}

无需将inAction 更改为Func&lt;&gt;,因为您目前没有在inAction 中进行任何计算。

【讨论】:

  • 先生,对于同一个例子,我怎样才能用 func 委托替换动作委托
  • @Rock 您当前的示例不支持 Func 用例,但我添加了一个附加示例来返回触发回调的值。