C#将函数作为参数传递[重复]

Posted

技术标签:

【中文标题】C#将函数作为参数传递[重复]【英文标题】:C# pass function as argument [duplicate] 【发布时间】:2015-01-05 12:03:38 【问题描述】:

很遗憾,我看不到类似的问题,所以

我必须执行许多类似的函数,并且我想创建一个接受函数作为参数的函数,例如

    int Search (Func<bool> func)
    
        int start = Environment.TickCount;
        func();
        int end = Environment.TickCount;
        return end - start;
    

    void SearchTime()
     
        int time1 = Search(list.Contains(item));
        int time2 = Search(dictionary.ContainsKey(anotheritem));
        /* some more code */
    

但实际上它说这个论点似乎不正确。

UPD:错误提示:The most appropriate overloaded method has some invalid arguments

【问题讨论】:

请提供错误信息。 @B.K.我实际上没有相同的论点,我使用现有的函数,但 Guffa 给出了确切的答案。也许它是相似的,但我在那个主题中找不到答案 【参考方案1】:

您尝试发送到方法中的不是委托。

您可以使用 lambda 表达式为方法创建委托:

int time1 = Search(() => list.Contains(item));
int time2 = Search(() => dictionary.ContainsKey(anotheritem));

() 表示零输入参数。

【讨论】:

【参考方案2】:

你做了什么:

Search(list.Contains(item));

这将首先计算内部表达式list.Contains(item),它是一个布尔值,而不是一个具有布尔返回值的函数。接下来,这个值而不是函数将被传递给Search(),这是不可能的,并且会导致编译器错误。

您有两个选择:使用 Guffa 已经指出的 lambda 表达式:

class Program

    static void Main(string[] args)
    
        SearchTime();
    

    static int Search(Func<bool> func)
    
        int start = Environment.TickCount;
        func();
        int end = Environment.TickCount;
        return end - start;
    

    static void SearchTime()
    
        IList<string> list = new []"item";
        IDictionary<string, string> dictionary = new Dictionary<string, string>   "key", "value"  ;

        int ticks1 = Search(() => list.Contains("item")); // Note: use () =>
        int ticks2 = Search(() => dictionary.ContainsKey("key")); // Note: use () =>
        /* some more code */
    

如果您不喜欢 () =&gt; 语法,可以将代码放入单独的方法中:

class Program2

    static void Main(string[] args)
    
        SearchTime();
    

    static int Search(Func<bool> func)
    
        int start = Environment.TickCount;
        func();
        int end = Environment.TickCount;
        return end - start;
    

    static void SearchTime()
    
        int ticks1 = Search(ListContains); // Note: do not use () on ListContains
        int ticks2 = Search(DictionaryContainsKey); // Note: do not use () on DictionaryContainsKey
        /* some more code */
    

    static IList<string> list = new[]  "" ;
    static bool ListContains()
    
        return list.Contains("item");
    

    static IDictionary<string, string> dictionary = new Dictionary<string, string> "key","value";
    static bool DictionaryContainsKey()
    
        return dictionary.ContainsKey("key");
    

【讨论】:

以上是关于C#将函数作为参数传递[重复]的主要内容,如果未能解决你的问题,请参考以下文章

将函数作为参数传递[重复]

在c#中将引用数组作为参数传递[重复]

将参数作为接口传递[重复]

传递方法作为参数[重复]

在函数c ++中将变量作为默认参数传递[重复]

c# 请问数组能作为参数传递吗? 如果可以如何传递呢?