如何干这两个“条件做”?

时间:2012-10-16 01:47:11

标签: c# while-loop dry

我有这样的函数(parentformToBeShown是WinForms表单实例):

if (parent == null)
    while (!formToBeShown.IsDisposed)
        Do();
else
    while (!parent.IsDisposed && !formToBeShown.IsDisposed)
        Do();

我发现这些非常不优雅。我希望只调用一次Do函数。如果我可以将所有条件合并到一个while循环中,那就更好了。不知道我是否有脑屁,但我想不出办法达到这个目的。一些想法?

2 个答案:

答案 0 :(得分:7)

我认为使用下面的代码,你只能使用while循环一次。

while (!formToBeShown.IsDisposed && (parent == null || !parent.IsDisposed))
        Do();

答案 1 :(得分:2)

让我们从逻辑上考虑这个。

第一个循环条件可以写成如下:

(parent == null && !formToBeShow.IsDisposed)

第二个循环的条件是:

(!parent.IsDisposed && !formToBeShown.IsDisposed)

你基本上有3个布尔变量:

设A:parent == null 设B:!formToBeShow.IsDisposed 设C:!parent.IsDisposed

现在你可以简化为

// Loop1 || Loop2  call Do() When:
(A && B) || (C && B)

使用布尔逻辑的规则,这变为:     B&& (A || C)

while(!formToBeShow.IsDisposed && (parent == null || !parent.IsDispoed))
    Do();

你需要确保父== null检查首先是它可以快捷方式,避免尝试取消引用null。

虽然存在问题,但您通过在每个循环上检查(parent == null)来执行其他工作。所以从技术上讲,如果你想把它带到循环之外并写一个以上,你可能有理由。虽然,对于这么简单的事情,我可能更喜欢单循环。