2010-08-02 80 views
6

好友複雜如果邏輯

如何實現以下複雜邏輯?

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相同的是 「我」

  4. 否則返回 「這兩個」 如果flag1,flag2和flag3是「A」和「I」(或「N」)

eg 1)標誌1是「A」並且標誌2是「I」並且標誌3是「I」0123。 2)標誌1是「I」並且標誌2是「A」並且標誌3是「I」0123。 2)標誌1爲 「A」 和FLAG2是 「N」 和Flag3相同的是 「我」

retrun結果

感謝您的答覆,但沒有後給出答案。我知道是否有其他的方法來限制和尋找邏輯來實現上面的psedocode。所有四個都是可能的條件,特別是#4是複雜的,需要知道如何實現。

+4

你真的在問如何編寫布爾邏輯嗎?或者你在尋找替代方案嗎? – 2010-08-02 19:43:56

+0

@Kumar:您是否希望我們將您的僞代碼轉換爲C#,這將幾乎簡單明瞭? – 2010-08-02 19:48:31

+1

我們應該如何閱讀第4點?那些parens現在沒有意義。 – 2010-08-02 19:49:24

回答

20

您的點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 
} 
+1

+1爲枚舉...和3行soln到一個臃腫的Q :) – Vishal 2010-08-02 19:48:37

+0

+1爲簡單單如果/ else – 2010-08-02 19:50:28

+2

擺脫其他,你已經返回,如果if爲true 。否則+1能夠找出發佈的奧術要求。假設你的解釋是準確的.. – 2010-08-02 19:50:34

1

我認爲這符合兩國的可讀性和速度,如果你首先檢查是否所有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) 
0

這會*工作。不能說我喜歡它。

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

我歡迎消極。因爲我知道它不好;) – Nix 2010-08-02 20:04:52

+0

你證明了錯誤的代碼是正確的,沒有理由在這裏投票。 – 2010-08-02 20:35:44

2
[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); 
} 
0

Robaticus給你正確的答案,但在評論,而不是一個職位,所以我會在其擴張。

我們有三個標誌可以採取三種狀態。因此有3 * 3 * 3 = 27個可能的選項。

當面對複雜的if..then邏輯和這樣一個小地址空間時,根本無法嘗試編寫所有if..then的代碼。相反,一個三維數組總共包含27個元素。

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

私人INT ParseFlag(串標誌) { 開關(標誌) { 情況下 「N」:返回None; case「I」:return Inactive; 情況「A」:返回活動; 默認拋出新的異常(string.Format(「有一個標誌值爲{0}但期望N,我或A」,標誌)); } }

公共FlagResult查找(字符串的Flag1,Flag2相同的字符串,字符串相當於Flag3) { 返回FlagData [ParseFlag(標記1),ParseFlag(標誌2),ParseFlag(相當於Flag3)];我想讓你建立數組。