我有一个EventHandler,它需要调用具有不同值的函数。如果有人返回true,则停止前进并返回。这符合||短路评估。写这个的最好方法是什么?
示例:
private void EventHandler(object sender, EventArgs e)
{
// how to call foo(1), foo(3), foo(2)?
}
private bool foo(int i)
{
return i == 3;
}
没有||的无聊的人:
private void EventHandler(object sender, EventArgs e)
{
if (foo(1)) { return; }
if (foo(3)) { return; }
foo(2);
}
错误:
private void EventHandler(object sender, EventArgs e)
{
foo(1) || foo(3) || foo(2);
}
傻傻的||无用的回报:
private void EventHandler(object sender, EventArgs e)
{
if (foo(1) || foo(3) || foo(2)) { return; }
}
傻傻的||无用的任务:
private void EventHandler(object sender, EventArgs e)
{
var boo = foo(1) || foo(3) || foo(2);
}
愚蠢的附加功能:
private void EventHandler(object sender, EventArgs e)
{
bar();
}
private bool bar()
{
return foo(1) || foo(3) || foo(2);
}
复杂的一个:
private void EventHandler(object sender, EventArgs e)
{
foreach (int i in new[] { 1, 3, 2 })
{
if (foo(i))
{
return;
}
}
}
Linq one(更难理解和维护):
private void EventHandler(object sender, EventArgs e)
{
(new[] { 1, 3, 2 }).Any(i => foo(i));
}
我最好的选择是无用的回报。你有其他选择吗?
答案 0 :(得分:0)
我会说foreach
是最好的只是因为它更灵活(如果你需要,你可以添加更多的值)。
答案 1 :(得分:0)
如果你有很多不同的值,循环似乎是最好的选择。 如果它只有几个值(不超过3或4)你可以使用无用的返回,或类似的东西(基本相同):
private void EventHandler(object sender, EventArgs e)
{
if (foo(1) || foo(3) || foo(2)) { /* do nothing */ }
}
答案 2 :(得分:0)
如果您有许多处理程序,则可以使用包含事件处理程序列表的List<Func<bool>>
:
List<Func<bool>> handlers = new List<Func<bool>>() {
() => foo(1),
() => foo(2),
() => foo(3)
};
foreach (var handler in handlers) {
if (handler())
return;
}
您可能还希望将事件传递给foo
,但不清楚其类型是什么,因此只需相应更改Func
签名。
答案 3 :(得分:0)
我认为你的复杂程度远远超过它所需要的程度。您正试图写道:“如果调用foo(1)
返回false,请调用foo(3)
。如果调用foo(3)
返回false,请调用foo(2)
”为什么不准确地写是什么?
private void EventHandler(object sender, EventArgs e)
{
// adjust indentation/braces as you see fit
if (!foo(1))
if (!foo(3))
foo(2);
}