Как заменить делегат Action забавным c делегатом, возвращающим значение функции - PullRequest
1 голос
/ 27 января 2020

У меня есть функция, называемая 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);


            }
        }
     }

я хочу вернуть значение i в Completeddownload Function, используя fun c, делегировать, какой подход

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

, а также помочь мне в основном, как его указать.

1 Ответ

1 голос
/ 27 января 2020

В вашем примере вам не нужно ничего делать с ответом. В результате вместо того, чтобы пытаться вернуть значение из вашего CompletedDownload метода, вы можете обработать свое действие и просто нарушить свой l oop, если условие выполнено.

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

Это запустит ваш action, выйдите из l oop и вернитесь к вызывающему методу.

Если вам абсолютно необходимо вернуть входную переменную, вызвавшую действие, просто измените тип возврата 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<>, поскольку в настоящее время вы не выполняете никаких вычислений в inAction.

...