【问题标题】:Looping inside a if block在 if 块内循环
【发布时间】:2015-04-19 12:36:45
【问题描述】:

以下内容在任何编程语言中都很常见。

  foreach(.....)
  {
         if(...)
           ....
  }

我想知道使用以下内容是否是一种好的编程习惯。我知道它有效,但它看起来有点不整洁。

  if(....)
  {
        foreach(...)
        {
           ...
        }
 }

当某些条件评估为真时迭代集合是必需的。但我从未在任何类型的示例代码中看到过这种情况。简而言之,我从未在其他人编写的代码中注意到这一点。但这有效并给了我想要的东西。但我想避免在 if 块中编写循环。

有人可以指出一个替代方案吗?

【问题讨论】:

  • 如果条件为真,那么您想对集合做一些事情吗?我认为这没有问题。
  • 该代码没有任何问题。为什么会这样想?
  • 这两者背后的逻辑不同。两者都有效,但是在第一个中,如果您对集合的每个项目都有某种处理逻辑,则在循环中执行 if,在第二个中,仅当外部条件为真时才执行循环
  • 没有错!

标签: c# if-statement foreach


【解决方案1】:

两者都很好,但当然你应该只使用有效的构造

foreach 循环内的if 语句经常检查被枚举的每个元素的某些属性。在这种情况下,您不能交换语句的顺序,因为您需要为每个元素执行if

例如:

foreach (Foo foo in fooCollection)
{
    if (foo.Name == "ignore me")
    {
        continue;
    }

    Console.WriteLine(foo.Name);
}

另一方面,在循环内部检查循环“不变”的条件会很浪费。也就是说,总是有相同的结果。

例如:

bool ignoreAllFoos = true;

foreach (Foo foo in fooCollection)
{
    if (ignoreAllFoos)
    {
        continue;
    }

    Console.WriteLine(foo.Name);
}

这(通常)是无用且低效的。如果您永远不会处理任何元素,为什么要枚举所有元素?所以在这种情况下,您可以(并且应该)将foreach 放入if

bool ignoreAllFoos = true;

if (!ignoreAllFoos)
{
    foreach (Foo foo in fooCollection)
    {
        Console.WriteLine(foo.Name);
    }
}

当然,上面的例子完全是人为的。但我希望他们能说明在foreach 循环中使用if 与在if 中使用foreach 循环之间的区别。这两种编写代码的方式确实做同样的事情,但它们都是有用的编写代码的方式。这仅取决于您实际想要的行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-28
    • 2021-11-17
    • 2018-09-14
    • 1970-01-01
    • 2018-09-29
    • 1970-01-01
    • 1970-01-01
    • 2018-01-26
    相关资源
    最近更新 更多