函数包含另一个函数

时间:2016-08-11 14:31:20

标签: c# function

我有一组静态函数,比如

internal static List<ClassA> GetListOfClassA (int id, string name) {...}
internal static string GetName (int id) {...}
internal static List<ClassB> GetCompleteListOfClassB() {...}

我想在这里完成以下内容(写为伪代码)

List<ClassA> newList = new List<ClassA>;
string newname;
List<ClassB> newListB = new List<ClassB>;

Pipe (newList = GetListOfClassA (5, "myname"));
Pipe (newname = GetName (5));
Pipe (newListB = GetCompleteListOfClassB());

管道应该是一个接受带参数的另一个函数的函数,执行一些代码并允许将函数的值返回给调用者。管道应该做类似

的事情
{
 Console.WriteLine ("Test");
 if (CertainCondition==true)
     return GetName (value);
 else 
    wait(250);
}

我尝试过各种类似lambda表达式或动作的东西,但我不能让它一直工作,以便接受所有类型的函数。

3 个答案:

答案 0 :(得分:6)

当你这样做时会起作用:

SELECT 
  Date,
  FundCode,
  Price
FROM
  PriceHistory H
    INNER JOIN 

      /* this nested query gives the max date for each fund*/
      (SELECT 
         FundCode,
         max(Date) AS MaxDate
       FROM
         PriceHistory H2
       WHERE
         Date<=@DateToSearchFor
       GROUP BY
         FundCode) AS RowSelector

    ON H.FundCode=RowSelector.FundCode AND H.Date=RowSelector.MaxDate

您可以像这样实施List<ClassA> newList = new List<ClassA>(); string newname; List<ClassB> newListB = new List<ClassB>(); newList = Pipe(() => GetListOfClassA(5, "myname")); newname = Pipe(() => GetName(5)); newListB = Pipe(() => GetCompleteListOfClassB());

Pipe

你也可以将它实现为一个函数,它本身不返回任何东西,但需要一个有副作用的public static T Pipe<T>(Func<T> action) { Console.WriteLine("Entering pipe"); if (someCondition) return action(); else { // do something else; but you still need to return something return default(T); } } (例如设置一个变量):

Action

除了您不需要返回任何内容之外,实现将非常相似:

Pipe(() => newList = GetListOfClassA(5, "myname"));
Pipe(() => newname = GetName(5));
Pipe(() => newListB = GetCompleteListOfClassB());

前者的好处是可以清楚地看到副作用,即设置的变量,而后者在变量可以保持未分配的情况下离开。

答案 1 :(得分:2)

我的第一个猜测是Pipe没有将任何参数传递给&#39; GetName&#39;功能

在这种情况下,您可以让Pipe接受Action并像

一样使用它
Pipe(() => newList = GetListOfClassA(5, "myname"));

答案 2 :(得分:0)

问题是你必须为你想要评估的每个参数提供一个通用版本,如上所述。对于GetListOfClassA的示例,它有2个参数和一个返回类型,您可以按如下方式执行此操作。

public TResult Pipe<T1,T2,TResult>(Func<T1,T2,TResult> f, T1 arg1, T2 arg2)
{
    Console.WriteLine ("Test");
    if (CertainCondition==true)
        return f(arg1, arg2);
    else 
        wait(250);
}

可以按如下方式调用此函数。

Pipe( GetListOfClassA, 5, "myname" );

您必须为不同数量的参数提供类似的版本。