Использование побитового ИЛИ в перечислениях - PullRequest
1 голос
/ 17 сентября 2011

Мне нужно обработать ввод от пользователя в консольном приложении, и мне нужно разрешить только номера полей Z (..., -1, 0, 1, ...).
Я построил этот процесс символ за символом от пользователя, сохраняя последний символ, я могу проверить, что порядок правильный. в конце пользователь должен ввести набор чисел Z, например
-3 6 7 101 -500.
Моя проблема заключается в сравнении LastInput как enum, что означает, что я хочу проверить, был ли последний ввод Numeric | Space | ..., пожалуйста, посмотрите на код.

public void Foo()
{
    ConsoleKeyInfo key;
    var chars = new List<char>();
    NextChar last = NextChar.Space;
    var list = new List<NextChar> {last};

    do
    {
        key = Console.ReadKey(true);
        NextChar next = ProcessCharInput(key.KeyChar);
        switch (next)
        {
            case NextChar.None:
            if(key.Key != ConsoleKey.Enter)
            {
                return;
            }
            continue;

            case NextChar.Space:
            if (last == (NextChar.Numeric))
            {
                Console.Write(key.KeyChar);
                last = next;
                chars.Add(key.KeyChar);
            }

            break;
            case NextChar.Minus:
            if (last == (NextChar.Space))
            {
                Console.Write(key.KeyChar);
                last = next;
                chars.Add(key.KeyChar);
            }
            break;
            case NextChar.Numeric:
            if (last == (NextChar.Numeric | NextChar.Minus | NextChar.Space))
            {
                Console.Write(key.KeyChar);
                last = next;
                chars.Add(key.KeyChar);
            }
            break;
            default:
            throw new ArgumentOutOfRangeException();
        }
    }
    while (true);
}

[Flags]
private enum NextChar
{
    None = 0x0,
    Space = 0x1,
    Minus = 0x2,
    Numeric = 0x4
}

Я предполагаю, что я делаю что-то не так с перечислением, потому что ввод Numeric и последний Space я не могу получить last == (NextChar.Numeric | NextChar.Minus | NextChar.Space), чтобы быть правдой.

Ответы [ 3 ]

3 голосов
/ 17 сентября 2011

Вы уверены, что пытаетесь сделать побитовое ИЛИ?

0100 OR 0010 OR 0001 = 0111

Что, похоже, не помогает.Кажется вероятным, что вы пытаетесь сделать логическую логику здесь.В этом случае вы захотите изменить

last == (NextChar.Numeric | NextChar.Minus | NextChar.Space)

на

last == NextChar.Numeric || last == NextChar.Minus || last == NextChar.Space

... конечно, если честно, если вы ограниченынабор из 4 значений, и вы пытаетесь убедиться, что вы делаете что-то с 3 из них, вы, вероятно, более ясны и выразительны с

if(last != NextChar.None)
2 голосов
/ 17 сентября 2011

Общий шаблон, который вы хотите использовать для битовых флагов, - <comparison value> <operation> (value & mask)). Для вашего случая специально:

if(NextChar.None != (last & (NextChar.Numeric | NextChar.Minus | NextChar.Space))) { ... }

2 голосов
/ 17 сентября 2011

Следующие строки иллюстрируют, как это будет интерпретироваться:

last == (NextChar.Numeric | NextChar.Minus | NextChar.Space)
last == (4 | 2 | 1) // Same meaning with the constants in place.
last == 7 // Same meaning, with the or calculated.

Вероятно, вам нужно что-то вроде:

last == NextChar.Numeric || last == NextChar.Minus || last ==  NextChar.Space

или с побитовой логикой:

last & (NextChar.Numeric | NextChar.Minus | NextChar.Space) != 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...