没有返回值的C#短路评估

时间:2015-07-29 05:41:40

标签: c#

我有一个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));
}

我最好的选择是无用的回报。你有其他选择吗?

4 个答案:

答案 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);
}