Страницы

Поиск по вопросам

понедельник, 3 февраля 2020 г.

Передать функцию в другую функцию

#c_sharp


Как сделать так чтобы функция FillListStart принимала в качестве аргумента функцию
TableRoTic

private void FillListTar(List> sortListArray1, List> sortListArray2,
string nameTar, bool flag)
{
    namesTar.Add(nameTar);
    dtTar.Add(new DataTable());
    tarIndex++;
    dtTar[tarIndex] = TableRoTic();
    DataRow newRow = null;
    if (flag == true)
    {
        for (int i = 0; i < sortListArray1.ElementAt(0).Count; i++)
        {
            newRow = dtTar.ElementAt(tarIndex).NewRow();
            newRow["rho0"] = sortListArray1.ElementAt(0).ElementAt(i).ToString();
            newRow["tic"] = sortListArray2.ElementAt(1).ElementAt(i).ToString();
            dtTar.ElementAt(tarIndex).Rows.Add(newRow);
        }
    }
    else
    {
        for (int i = 0; i < sortListArray1.ElementAt(0).Count; i++)
        {
            newRow = dtTar.ElementAt(tarIndex).NewRow();
            newRow["rho0"] = sortListArray1.ElementAt(0).ElementAt(i).ToString();
            newRow["tic"] = sortListArray2.ElementAt(0).ElementAt(i).ToString();
            dtTar.ElementAt(tarIndex).Rows.Add(newRow);
        }
    }
}

private DataTable TableRoTic()
{
    //создаём таблицу
    DataTable dtRoTic = new DataTable();
    //создаём три колонки
    //DataColumn a0 = new DataColumn("a0", typeof(Double));
    DataColumn ro = new DataColumn("rho0", typeof(String));
    DataColumn tic = new DataColumn("tic", typeof(String));

    dtRoTic.Columns.Add(ro);
    dtRoTic.Columns.Add(tic);
    return dtRoTic;
}

    


Ответы

Ответ 1



Попробуйте воспользоваться делегатами. Если вкратце - это как раз объект, содержащий в себе ссылку на метод. Примерно так будет выглядеть код в Вашем случае: // Объявляем тип делегата delegate DataTable SomeDelegat(); static void Main(string[] args) { // Создаем делегает, который ссылается на нужный метод SomeDelegat sd = new SomeDelegat(GetTable); // Вызываем метод с делегатом в качестве аргумента FillListTar(sd); } // Объявляем метод, на входе которому подается делегат private void FillListTar(SomeDelegat sd) { sd.Invoke(); // Выполнение метода делегата } private static DataTable TableRoTic() { DataTable dtRoTic = new DataTable(); // Какой-то нужный код return dtRoTic; }

Ответ 2



Два метода: Определить свой делегат delegate DataTable TableDelegate(); private void FillListTar( TableDelegate func, List> sortListArray1, List> sortListArray2, string nameTar, bool flag) { ... } Либо, воспользоваться предопределенным делегатом Func private void FillListTar( Func func, List> sortListArray1, List> sortListArray2, string nameTar, bool flag) { ... } Ну и вызов: FillToStart(TableRoTic, ...); Более подробно о Func можно почитать здесь

Комментариев нет:

Отправить комментарий