不幸的是,我无法在类似的情况下看到这个问题,所以
我必须执行许多类似的函数,我想创建一个函数来接受函数作为参数,例如。
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
答案 0 :(得分:10)
您尝试发送到该方法的不是代表。
您可以使用lambda表达式为方法创建委托:
int time1 = Search(() => list.Contains(item));
int time2 = Search(() => dictionary.ContainsKey(anotheritem));
()
表示零输入参数。
答案 1 :(得分: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 */
}
}
如果您不喜欢() =>
语法,可以将代码放在不同的方法中:
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");
}
}