Комплекс, если еще логика

Друзья

Как я реализую следующую сложную логику?

flag1 может быть "N" или "A" или "I"
flag2 может быть "N" или "A" или "I"
flag3 может быть "N" или "A" или "I"

функция (представляют flag1 в виде строки, представляют flag2 в виде строки, представляют flag3 в виде строки) начинается

Функция должна возвратиться:

  1. не возвратите "Ни один", если flag1, flag2 и flag3 являются "N"

  2. еще возвратитесь "Активный", если flag1, flag2 и flag3 являются "A"

  3. еще возвратитесь "Неактивный", если flag1, flag2 и flag3 являются "I"

  4. еще возвратитесь "и" если flag1, flag2 и flag3 являются или "A" И "I" (ИЛИ "N")

например, 1) flag1, и flag2, "я" и flag3 - "я"
например, 2) flag1, "я" и flag2, и flag3 - "я"
например, 2) flag1, и flag2 является "N", и flag3 - "я"

возвратите результат

конец

Спасибо за ответ, но ни одно из сообщения не дает ответ. Я еще знаю если constrauct и поиск логики реализовывать выше psedocode. Все четыре являются возможными условиями, особенно № 4 сложен и потребность знать, как реализовать это.

6
задан Kumar 2 August 2010 в 19:58
поделиться

5 ответов

Ваша логика для пункта 4 запутана...

Я бы использовал для этого значения перечисления, а не строки - это гораздо более безопасно для типов (например, что если кто-то передаст "WIBBLEWOBBLE" вашему методу? Что он должен вернуть?)

enum Value { None, Active, Inactive, Both }

private Value GetValue(Value flag1, Value flag2, Value flag3) {
    if (flag1 == flag2 && flag2 == flag3)    // they are all the same
        return flag1;
    else return Value.Both;    // there is a difference
}
20
ответ дан 8 December 2019 в 05:19
поделиться
[Flags]
enum SomeWierdReturn
{ Both = 0, None = 1, Active = 2, Inactive = 4 }

public SomeWierdReturn DoSomething(SomeWierdReturn flag1, SomeWierdReturn flag2, SomeWierdReturn flag3)
{
    return (SomeWierdReturn)(flag1 & flag2 & flag3);
}
2
ответ дан 8 December 2019 в 05:19
поделиться

Robaticus дал вам правильный ответ, но в комментарии, а не в посте, поэтому я расширю его.

У нас есть три флага, которые могут принимать каждое из трех состояний. Таким образом, существует 3 * 3 * 3 = 27 возможных вариантов.

При сложной логике if...then и таком маленьком адресном пространстве нет никакого смысла пытаться закодировать все if...then. Вместо этого используется один трехмерный массив, содержащий в общей сложности 27 элементов.

const int None = 0; const int Inactive = 1; const int Active = 2;

private int ParseFlag(string Flag) { switch (Flag) { case "N": return None; case "I": return Inactive; case "A": return Active; default throw new Exception(string.Format("Получено значение флага {0}, но ожидалось N, I или A", Flag)); } }

public FlagResult Lookup(string Flag1, string Flag2, string Flag3) { return FlagData[ParseFlag(Flag1), ParseFlag(Flag2), ParseFlag(Flag3)]; }

Я позволю вам построить массив.

0
ответ дан 8 December 2019 в 05:19
поделиться

Это должно сработать. Не могу сказать, что мне это нравится.

 string key = flag1 + flag2 + flag3;
 switch(key){
     case "NNN":
         return "None";
      case "AAA":
        return "Active";
      case "III":
        return "Inactive";
      default:
        break;
  }
  // ;)
 //Trying to make it as confusing as your requirement #4
  var four = (
     from s in key
     select s
   ).Distinct();

  if(four.Count() > 1){
    return "Both";
  }



 }
0
ответ дан 8 December 2019 в 05:19
поделиться

Я думаю, что для читабельности и скорости будет лучше, если вы сначала проверите, равны ли все 3 значения.

if ((flag1 == flag2) and (flag1 == flag3))
   // use a switch or table to go 'I' -> Inactive etc
else
  return "Both"; // as far as i understood 4)
1
ответ дан 8 December 2019 в 05:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: