Что не так с этой логической итерацией? - PullRequest
1 голос
/ 25 января 2011

Выполняя эту итерацию 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 ]

3 голосов
/ 25 января 2011

У этого цикла есть инвариант: при входе в тело validExtension = false.

Таким образом, тело можно упростить до:

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

Если бы такого инварианта не было, вы могли бы использовать составной оператор присваивания |=, если вы всегда хотели оценить правую часть, или if (!lhs) lhs = rhs;, если вы хотели короткого замыкания.

2 голосов
/ 25 января 2011
foreach (string extension in Plugin.Extensions)
{
     if (Path.GetExtension(file).Equals(extension.TrimStart('*'), StringComparison.InvariantCultureIgnoreCase))
     {
          validExtension = true;
          break;
     }
}

Это работает, потому что вы ломаете первый раз, когда находите действительное расширение, поэтому validExtension всегда ложно в первой строке цикла.

1 голос
/ 25 января 2011

нельзя просто сказать validExtension = Path.Get...., поскольку в начале выражения validExtension всегда будет ложным.

0 голосов
/ 25 января 2011

Если это строка [], весь код можно изменить следующим образом:

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

Для проверки значения внутри массива вы всегда можете использовать метод расширения Array.Contains.
PS: я полностью изменил тесты, как справедливо сказал Бен Фойгт

0 голосов
/ 25 января 2011

Хотя в C # нет оператора ||=, есть оператор |=, который может быть тем, что вы ищете. MSDN Ссылка

...