将关系运算符作为方法中的参数传递



我是新手。我想做这样的事情:

private int myLoop (int start, int end, string relationalOperator)
{
int count = 0;
for (int i = start; i <= end; i++)
{
if ( X +relationalOperator+ Y) 
count++;
}
return count;
}

然后做:

myLoop(1,10,>=);

所以我可以将关系运算符作为参数传递。怎么能做到这一点呢?

不,你不能。例如,为什么不能将运算符作为参数传递?

但是,您可以传递委托。这实际上会更灵活,因为调用方可以使用更复杂的逻辑,而不仅仅是一些比较运算符。但这通常不会成为问题。

在您的示例中,它可能如下所示:

private int myLoop (int start, int end, Func<int, int, bool> op)
{
int count = 0;
for (int i = start; i <= end; i++)
{
if (op(X, Y))
count++;
}
return count;
}

你可以像这样使用它:

myLoop(1, 10, (x, y) => x >= y);

(我不知道XY应该在您的原始示例中表示什么,所以我只是保持原样。你可以在那里使用任何你喜欢int值。

Func<int, int, bool>是一个委托类型,它是一种函数指针。 即它可以指向要执行的函数。该特定委托类型内置于 .NET 中,表示采用两个int参数并返回bool值的任何方法。您还可以使用delegate关键字声明自己的自定义委托类型。请参见委托(C# 编程指南(。

可以通过多种方式创建委托实例。在上面的示例中,(x, y) => x >= y是一个lambda表达式。C# 编译器将其转换为匿名方法,在此特定示例中,该方法采用两个参数,使用这些参数x >= y计算表达式,并返回结果。参数类型由编译器根据上下文推断为int,在本例中为要调用的方法。

最新更新