这个布尔迭代有什么问题?

时间:2011-01-25 01:37:35

标签: c# foreach boolean

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

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;

5 个答案:

答案 0 :(得分:3)

该循环具有不变量:在进入身体时validExtension = false

所以身体可以简化为:

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

如果没有这样的不变量,如果您一直想评估右侧,可以使用复合赋值运算符|=,如果想要短路,可以使用if (!lhs) lhs = rhs;。 / p>

答案 1 :(得分:2)

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

这是有效的,因为您在第一次找到有效的扩展名时破解了,因此validExtension在循环的第一行始终为false。

答案 2 :(得分:1)

你不能只说validExtension = Path.Get....,因为在表达式的开头,validExtension总是为false。

答案 3 :(得分:0)

虽然C#中没有||=运算符,但|=运算符可能正是您要查找的内容。 MSDN Reference

答案 4 :(得分:0)

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

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正确地说了