2017-01-10 6 views
3

ich folgenden Fall haben:Rückgabewert basierend auf mehreren Bool Bedingungen

enum values{ 
go = 1, 
stand = 2, 
jump = 3, 
run = 4, 
go_stand=5, 
go_jump=6, 
go_run=7, 
go_stand_jump=8, 
… and so on 
Go_stand_jum_prun=17} 

int select value(bool go, bool stand, bool jump, bool run) 
{ 
} 

Basierend auf Kombination von Bool Werte an die Methode übergeben Ich brauche entsprechenden Wert zurück, wenn = true und der Rest false 1 gehen bedeutet, wird Wird zurückgegeben, wenn alle übergebenen Parameter wahr sind, werden 17 zurückgegeben, das Gleiche gilt für alle dazwischen liegenden Kombinationen. Die einzige Idee, die ich habe, ist es eine Menge von wenn und wenn if Aussagen mögliche Kombinationen zu bewerten, die eine Art hässlich ist. Die Frage ist eine elegantere Lösung.

Danke euch allen !!!

+5

Welche Sprache sollte das sein? Nicht 'C#' sicher ... – Smartis

+1

Können Sie bitte die Frage ausführlich beschreiben? Welchen Wert sollten Sie zurückgeben? Die Funktion, die du geschrieben hast, ist eine Leere. – pinturic

+1

Wie enum mit booleschen Werten verwandt ist? Können Sie bitte zeigen, wie Sie Booleans verwenden? –

Antwort

1

Bewerben FlagsAttribute auf Ihre Aufzählung:

[Flags] 
public enum Activity 
{ 
    None = 0, 
    Go = 1, 
    Stand = 2, 
    Jump = 4, 
    Run = 8, 
} 

Und verwenden Sie die conditional operator, um Ihre Aufzählung zu erstellen:

public static Activity CreateActivity(bool go, bool stand, bool jump, bool run) 
{ 
    return 
     (go ? Activity.Go : 0) | 
     (stand ? Activity.Stand : 0) | 
     (jump ? Activity.Jump : 0) | 
     (run ? Activity.Run : 0); 
} 

Komplettes Beispiel:

using System; 

public class Program 
{ 
    public static void Main() 
    { 
     Activity goJump = Activity.Go | Activity.Jump; 

     Activity activity = 
      CreateActivity(
       go: true, 
       stand: false, 
       jump: true, 
       run: false); 

     Console.WriteLine(activity == goJump); // prints "True" 
    } 

    public static Activity CreateActivity(bool go, bool stand, bool jump, bool run) 
    { 
     return 
      (go ? Activity.Go : 0) | 
      (stand ? Activity.Stand : 0) | 
      (jump ? Activity.Jump : 0) | 
      (run ? Activity.Run : 0); 
    } 
} 

[Flags] 
public enum Activity 
{ 
    None = 0, 
    Go = 1, 
    Stand = 2, 
    Jump = 4, 
    Run = 8, 
} 
7

das Sie ändern müssen, um erreichen Ihre enum

enum values { 
    none = 0, 
    go = (1 << 0), // 1 
    stand = (1 << 1), // 2 
    jump = (1 << 2), // 4, 
    run = (1 << 3), // 8 
    go_jump = go | jump 
} 

Dann in Ihrer Methode:

values GetValues(bool go, bool stand, bool jump, bool run) 
{ 
    values result = values.none; 
    if(go) 
     result |= values.go; 

    if(stand) 
     result |= values.stand; 

    // and so on... 

    return result; 
} 
+0

Sie müssen zugeben, dass es 1978 einfacher war, aber trotzdem eine Verbesserung haben. – Bathsheba

+5

Sie sollten das Attribut Flags verwenden. https://msdn.microsoft.com/en-us/library/system.flagsattribute(v=vs.110).aspx – AndyJ

+0

@AndyJ Es ist besser lesbar ohne 'FlagsAttribute'. –

5

Sie können eine flags enum verwenden, damit die Werte in einer einzigen ENUM-Wert kombiniert.

Zeigt an, dass eine Aufzählung als ein Bitfeld behandelt werden kann; Das heißt, eine Reihe von Flags.

Hier ist ein Beispiel: (Dot Net Fiddle)

using System; 

[Flags] 
public enum Value 
{ 
    None = 0, 
    Go = 1, 
    Stand = 2, 
    Jump = 4, 
    Run = 8 
} 

public class Program 
{ 
    public static void Main() 
    { 
     var value1 = CreateValue(true, false, true, false); 
     var value2 = CreateValue(false, true, true, true); 

     Console.WriteLine(value1); //Go, Jump 
     Console.WriteLine(value2); //Stand, Jump, Run 
    } 

    public static Value CreateValue(bool go, bool stand, bool jump, bool run) 
    { 
     var value = Value.None; 

     if(go) 
      value |= Value.Go; 

     if(stand) 
      value |= Value.Stand; 

     if(jump) 
      value |= Value.Jump; 

     if(run) 
      value |= Value.Run; 

     return value; 
    } 
} 
+0

Sie vermisste den 'go_stand_jump' und andere Flags – Toshi

+0

@ Toshi - Nein. Lesen Sie die Antwort erneut. Und lesen Sie die verknüpften Flags MSDN. –

+0

@ Toshi Das Flags-Attribut behandelt das. Wenn Sie den Code ausführen (folgen Sie dem DotNetFiddle-Link), sehen Sie, dass die Konsole den Inhalt der Werte ausgibt. value2 ist "Stand, Jump, Run". – AndyJ

2

Sie können bitweise Mathematik verwenden. Zum Beispiel, hier ist Ihre Klasse:

class MyClass 
{ 
    [Flags] 
    public enum Values 
    { 
     Go = 1, 
     Stand = 2, 
     Jump = 4, 
     Run = 8 
    } 

    public Values Select(bool go, bool stand, bool jump, bool run) 
    { 
     Values ret = 0; 
     if (go) ret = (ret | Values.Go); 
     if (stand) ret = (ret | Values.Stand); 
     if (jump) ret = (ret | Values.Jump); 
     if (run) ret = (ret | Values.Run); 
     return ret; 
    } 
} 

Und hier ist, wie Sie es verwenden würde:

var mc = new MyClass(); 
MyClass.Values y = mc.Select(true, false, true, true); 
bool isStand = (y & MyClass.Values.Stand) == MyClass.Values.Stand; // false 
bool isJump = (y & MyClass.Values.Jump) == MyClass.Values.Jump; // true 
+0

Ich muss fragen, warum 2, 4, 8 und 64 eher als die traditionellen 1,2,4,8? – Chris

+0

Wer weiß. Nur mein Standard, denke ich. Hab nie viel nachgedacht. –

+0

Auch ich habe gerade bemerkt, dass Sie ein int eher als das enum zurückgeben. Das liegt daran, dass Sie sich mit Flags-Enums nicht auskennen (ich nehme an, dass Sie einen besseren Grund haben, stattdessen einen Int zu verwenden). – Chris

-1
public enum MyEnum 
{ 
    Nothing = 0, 
    Run = 1, 
    Jump = 2, 
    Stand = 4, 
    Go = 8, 
    RunJump = Run + Jump, 
    RunStand = Run + Stand, 
    ... 
} 

public MyEnum GetValue(bool go, bool stand, bool jump, bool run) 
{ 
    // true, true, true, true is 1111 
    // true, true, true, false is 1110 
    var returnValue = (go ? 1 << 3 : 0) + (stand ? 1 << 2 : 0) + (jump ? 1 << 1 : 0) + (run ? 1 : 0); 

    return (MyEnum)returnValue; 
} 
Verwandte Themen