【问题标题】:What's wrong with this boolean iteration?这个布尔迭代有什么问题?
【发布时间】:2011-01-25 01:37:34
【问题描述】:

在进行此布尔迭代时,我很想使用不存在的运算符||=,并认为必须有一个更简单或更好的设计来代替它的有效使用(而不是认为它只是“缺失”):

bool validExtension = false;

foreach (string extension in Plugin.Extensions)
{
    validExtension = validExtension || Path.GetExtension(file).Equals(extension.TrimStart('*'), StringComparison.InvariantCultureIgnoreCase);

    if (validExtension)
    {
        break;
    }
}

importButton.Enabled = File.Exists(importTextBox.Text) && validExtension;

【问题讨论】:

  • Plugin.Extensions 的类型是什么?
  • @yetanothercoder:只要你知道它会迭代字符串,这并不重要。
  • 您可能想反转最后一行中的测试,如果validExtension 为假,则进行昂贵的File.Exists 测试毫无意义。
  • @lazlo:为了好奇,我能知道吗? :)
  • @yetanothercoder static readonly string[],无聊到不行。

标签: c# foreach boolean


【解决方案1】:

该循环有一个不变量:在进入正文时,validExtension = false

所以正文可以简化为:

if (validExtension = Path.GetExtension(file).Equals(extension.TrimStart('*'), StringComparison.InvariantCultureIgnoreCase))
    break;

如果没有这样的不变量,您可以使用复合赋值运算符|=(如果您总是想计算右侧),或者使用if (!lhs) lhs = rhs;(如果您想短路)。

【讨论】:

  • == 或 =?你也不想设置validextension = true吗?
  • @yetanothercoder:=,单等号,也就是赋值。 validExtension 正在设置中。
  • 是的,我猜。但是如果我没有那个不变量呢?
  • @Ben Voigt 赋值操作几乎总是返回 true,除非赋值失败(在这种情况下你的应用程序有更大的问题)。这总是会在第一次通过时中断。
  • @Lazlo:阅读最后一句话,开头是“如果没有不变量”...
【解决方案2】:
foreach (string extension in Plugin.Extensions)
{
     if (Path.GetExtension(file).Equals(extension.TrimStart('*'), StringComparison.InvariantCultureIgnoreCase))
     {
          validExtension = true;
          break;
     }
}

这很有效,因为您在第一次找到有效扩展时就中断了,所以validExtension 在循环的第一行总是假的。

【讨论】:

    【解决方案3】:

    您不能只说validExtension = Path.Get....,因为在表达式的开头validExtension 将始终为假。

    【讨论】:

      【解决方案4】:

      虽然 C# 中没有 ||= 运算符,但您可能正在寻找 |= 运算符。 MSDN Reference

      【讨论】:

      • 但这不会短路,这在某些情况下可能很重要(它不在这里,因为先前的值始终是false,因此永远不会发生短路)。
      【解决方案5】:

      如果是字符串[],整个代码可以这样改

      Func<string[], string, bool> validExtension = (arr, s) => arr.Contains(s);
      importButton.Enabled = validExtension(Plugin.Extensions, Path.GetExtension(file)) && File.Exists(importTextBox.Text);
      

      要检查数组中的值,您始终可以使用Array.Contains 扩展方法。
      P.S:正如 Ben Voigt 所说,我已经推翻了测试

      【讨论】:

        猜你喜欢
        • 2014-08-31
        • 1970-01-01
        • 2015-12-22
        • 1970-01-01
        • 1970-01-01
        • 2012-08-07
        • 2014-08-29
        • 2013-06-05
        • 2014-06-04
        相关资源
        最近更新 更多