2016-05-27 7 views
6

Ich habe kleines Problem. Ich bin ein neuer Entwickler und ich habe eine Ansicht mit "Alterskriterium" für mein Produkt.Vier nullbare boolesche Mehrfachauswahl-Kontrollkästchen.

Diese Optionen sind: "< 24", "24 - 35", "35 - 45", "> 45".

A json, die ich zur Arbeit benötigen sieht, dass:

"age": { 
     "lessThan24": true, 
     "between24And35": true, 
     "between35And45": true, 
     "moreThan45": true 
     } 

My View Modell:

public class AgeCriterionViewModel 
{ 
    public bool? LessThan24 { get; set; } 
    public bool? Between24And35 { get; set; } 
    public bool? Between35And45 { get; set; } 
    public bool? MoreThan45 { get; set; } 
} 

Und mein Domain-Modell:

public class AgeCriterion 
{ 
    public int? From { get; set; } 
    public int? To { get; set; } 
} 

So, hier ist mein Problem. Ich muss Viewmodel zu Domänenmodell zuordnen. Diese booleschen Werte sind jedoch nullfähig, sodass sie null, falsch oder wahr sein können. OLSO kann Multiselect sein. Diese Optionen können also "lessthan24" und "zwischen35and45" sein oder alle oder keine.

Ich denke über etwas schreckliche BIG IF Konstruktion zu bauen. Aber wie kann ich alle Möglichkeiten prüfen? Gibt es einen schönen Weg?

Ich habe, dass in diesem Moment:

 if (age == null) 
      return null; 
     AgeCriterion criterion = new AgeCriterion(); 

     if (age.LessThan24.HasValue) 
     { 
      if (age.LessThan24.Value) 
      { 
       criterion.From = 0; 
       criterion.To = 24; 
      } 
     } 
+0

Trennen Sie es aus, erstellen Sie Methoden, die einen nullbaren booleschen Wert in einen booleschen Standard konvertieren und wiederverwenden. Wie für einen netten Weg, nicht, dass ich bewusst bin, müssen Sie tun, wenn Aussagen irgendwo, aber machen Sie es so, dass der Code wiederverwendbar ist, um sich in Zukunft zu speichern – Draken

+3

Wie verwalten Sie Kriterium, wenn ich 'LessThan24' überprüfe & # Zwischen24 und 35'? –

+0

'public boolean isValid (boolescher Wert?) { return value.hasValue?Wert: falsch; } ' Als ein Beispiel für Ihre Methode. Dann kannst du einfach 'if (isValid (age.LessThen24)) { // Dein Code }' – Draken

Antwort

5

Sie Enum schaffen könnte und verwenden bitmask:

[Flags] 
public enum AgeCriterion 
{ 
    NotSpecified = 0, 
    BelowTwentyFour = 1, 
    TwentyToThirtyFive = 2, 
    ThirtyToFourtyFive = 4, 
    MoreThanFourtyFive = 8, 
} 

public class AgeCriterion 
{ 
    public AgeCriterion Age { get; set; } 
} 

Und Karte Viewmodel zu diesem Enum wie folgt:

var criterion = new AgeCriterion(); 

    if (age == null) 
     return criterion; // fill free to return null if it better suit your needs 

    AgeCriterion age; 

    age = age.LessThan24 == true ? age | AgeCriterion.BelowTwentyFour : age; 

    age = age.Between24And35 == true ? age | AgeCriterion.TwentyToThirtyFive : age; 

    age = age.Between35And45 == true ? age | AgeCriterion.ThirtyToFourtyFive : age; 

    age = age.MoreThan45 == true ? age | AgeCriterion.MoreThanFourtyFive : age; 

    criterion.Age = age; 

    return criterion; 

P.S. für bestimmte Kriterium Um zu überprüfen (s) im Code, den Sie dies tun können:


etwas für Leute von 24 bis 35 und über 45 Jahre alt tun (ich würde sagen, es nicht zu viel Sinn macht ich, aber immer noch)

if(criterion.Age == AgeCriterion.TwentyToThirtyFive & criterion.Age == AgeCriterion.MoreThanFourtyFive) 

Um etwas für Leute von 24 bis 35 oder über 45 Jahre alt


zu tun
if(criterion.Age == AgeCriterion.TwentyToThirtyFive | criterion.Age == AgeCriterion.MoreThanFourtyFive) 
+0

Es sieht sehr klar aus, aber es ist zu kompliziert für mich und ich verstehe nicht, was hier vor sich geht :(Und ich muss Bereich/Bereich von angeben, bis. – Nerf

+0

Sie Bereiche mit dieser Methode angeben, finden Sie mehr grundlegende Beispiel hier: http://stackoverflow.com/questions/1030090/how-do-you-pass-multiple-enum-values-in-c oder hier http://www.dotnetperls.com/enum-flags – Fabjan

+0

Thx es wirklich Arbeit! Einfach und klar. – Nerf

3

Sie die ?? Operator (C# Reference) können Ihre if/else zu minimieren.

if (age.LessThan24 ?? false) 
{ 
    criterion.From = 0; 
    criterion.To = 24; 
} 
else if (age.Between24And35 ?? false) 
{ 
    criterion.From = 24; 
    criterion.To = 35; 
} 
// And so on 

, was es tut, ist:
wenn age.LessThan24 ist null als verwenden false, wenn nicht den Wert davon verwenden:

if (age.LessThan24 != null) 
{ 
    if(age.LessThan24.Value) 
    { 
     // .... 

    } 
} 
+2

Es gibt keine Notwendigkeit für spezielle Operatoren, 'age.LessThan24 == true' wird das gleiche tun, aber das ist nicht das Hauptproblem. Die Frage ist in einigen Fällen unklar und unlösbar. –