2017-10-04 2 views
0
Schreiben

Im Moment habe ich ein Stück Code, der wie folgt aussieht:einen Schalter effizienter

switch (objectname) 
{ 
    case "objectbla": 
     DoSomething(1, objectName, someOtherVar); 
     break; 
    case "objectblabla": 
     DoSomething(2, objectName, someOtherVar); 
     break; 
    case "objectetc": 
     DoSomething(3, objectName, someOtherVar); 
     break; 
    case "objectanother": 
     DoSomething(4, objectName, someOtherVar); 
     break; 
    case "objectobj": 
     DoSomething(5, objectName, someOtherVar); 
     break; 
    default: 
     break; 
} 

nun zu sehen, wie sich wiederholende dieser Schalter ist nur der erste Parameter einmal gezählt, ich bin sicher, dass dies könnte effizienter geschrieben werden. Ich bin mir jedoch nicht sicher. Was wäre ein besserer Weg dies zu schreiben?

+2

Nun, wenn 'objectname' ein' enum' war, konnte der ENUM Wert übergeben werden in 'DoSomething ((int) yourEnumValue, ObjektName, someOtherVar);' – DiskJunky

+3

alle Saiten in ein Wörterbuch setzen 'Wörterbuch ' und einen einzelnen Aufruf 'DoSomething (dict [objectname], Objektname, someOtherVar)' –

+2

oder 'Array.IndexOf (stringArray, Objektname) + 1' –

Antwort

6

Wenn der erste Parameter die einzige Sache ist, die unterschiedlich in Abhängigkeit von objectname ist, sollten Sie mit einem Wörterbuch für das betrachten:

// you only have to set this up once 
var lookup = new Dictionary<string, int>() 
{ 
    ["objectbla"] = 1, 
    ["objectblabla"] = 2, 
    ["objectetc"] = 3, 
    ["objectanother"] = 4, 
    ["objectobj"] = 5, 
}; 


// actual logic 
if (lookup.TryGetValue(objectname, out var objectId)) 
{ 
    DoSomething(objectId, objectName, someOtherVar); 
} 
else 
{ 
    // objectname is not in the lookup dictionary 
} 

Dies ist die allgemeine Idee. Abhängig davon, wie Ihr Lookup aussieht, können Sie auch verschiedene Lösungen wählen, aber das Wörterbuch ist die ausführlichste, aber auch flexibelste Art, es hier zu tun.

+0

nice poke, du hast es sehr gut gemacht –

1

Wenn es hat eine switch sein, wie etwa:

int aNumber; 
switch (objectname) 
{ 
    case "objectblabla": 
     aNumber = 1 
     break; 
    case "objectetc": 
     aNumber = 2 
     break; 
    case "objectanother": 
     aNumber = 3 
     break; 
    case "objectobj": 
     aNumber = 4 
     break; 
    default: 
     break; 
} 

DoSomething(aNumber, objectName, someOtherVar); 

Und wenn nicht:

string[] ListOfObjectNames = { "objectblabla", "objectetc", "objectanother" }; 
DoSomething(Array.IndexOf(ListOfObjectNames, objectname), objectName, someOtherVar); 
1

Sie sind richtig, dass es einen besseren Weg gibt. Wenn Sie ein statisches Verzeichnis als Nachschlagetabelle erstellen, verwenden Sie das, um Ihre magischen Zahlen zu erhalten.

static Dictionary<string, int> lookup= new Dictionary<string, int>() 
{ 
    { "objectbla",1}, 
    {"objectblabla", 2}, 
    etc. 
}; 

Dann wird der Körper Ihrer Funktion wird:

DoSomething(lookup[objectname], objectName, someOtherVar); 

Sie auch Code hinzufügen, sollte wegen der Möglichkeit eines ungültigen Schlüssel nehmen verwendet werden, sonst wird es eine Ausnahme werfen, wie es steht .

1

Ich würde mit der Enum-Methode gehen.

enum objects 
{ 
    objectbla = 1, 
    objectblabla, 
    objectetc, 
    objectanother, 
    objectobj 
}; 

DoSomething((int)Enum.Parse(typeof(objects), objectName), objectName, someOtherVar);