c# - 将关系运算符作为参数传递给方法
问题描述
我是新手。我想做类似的事情:
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);
(我不知道在您的原始示例中应该代表什么X
,Y
所以我只是保持原样。您可以int
在那里使用您喜欢的任何值。)
是委托类型,是一种函数指针Func<int, int, bool>
。即它可以指向一个要执行的函数。该特定委托类型内置于 .NET 中,表示任何采用两个参数并返回一个值的方法。您还可以使用关键字声明自己的自定义委托类型。请参阅委托(C# 编程指南)。int
bool
delegate
可以通过多种方式创建委托实例。在上面的示例中,(x, y) => x >= y
是一个lambda表达式。C# 编译器将其转换为匿名方法,在此特定示例中,该方法采用两个参数,x >= y
使用这些参数计算表达式,然后返回结果。参数类型int
由编译器根据上下文推断出来,在这种情况下是您正在调用的方法。
推荐阅读
- python - Python os.system 和 mysqldump 的奇怪行为
- microsoft-graph-api - Microsoft Graph API - 503 服务不可用
- database - 单个端点和序列号是否会破坏 REST 的无状态性
- ruby-on-rails - Api::SessionsController#create 中的 NoMethodError
- python - Python 使用 WHERE IN {list} 运行 SQL 查询并且列表太长
- serilog - Serilog - 如何制作自定义控制台输出格式?
- python-3.x - 在像 Omega Onion2+ 这样的单板计算机上,缓慢的导入运行时间是否正常?
- ruby-on-rails - Rails 5:用户与其作为版主的页面之间的关联
- xml - 使用 LandXML 创建表
- c - 是否可以(不能)在 C 源代码中使用特殊字符?