J'ai un dto comme suit:
pubic string ConstructDays(DaysDetails d) { StringBuilder constructDays = new StringBuilder(); if(d.Sun == true) { constructDays.Append("0"); } if(d.Mon == true) { constructDays.Append("1"); } ..... //So on for all seven days string day = Convert.toString(constructDays); if(day != string.Empty && day[0] == ",") day = day.Remove(0,1); return day; }
J'ai une méthode qui vérifie si les jours sont vérifiés et crée un format de chaîne séparé par des virgules. Par exemple: si dimanche et lundi sont cochés, le résultat est "0,1" (nombres correspondant aux jours)
public class DaysDetails { public bool Sun {get;set;} public bool Mon {get;set;} ... public bool Sat {get;set;} //All 7 days of the week }
J'ai besoin de convertir cette fonction en un code plus facile à gérer et version simplifiée. Qu'est-ce qui peut être amélioré à cet égard?
4 Réponses :
Vous pouvez simplifier votre code en convertissant chaque booléen en int et en rejoignant la collection résultante.
public string ConstructDays(DaysDetails d) { var week = new[] { d.Sat ? 0 : -1, d.Sun ? 1 : -1, d.Mon ? 2 : -1, //...// }.Where(x => x != -1); return string.Join(",", week); }
Ou si vous recherchez plus que 0/1:
public class DaysDetails { public bool Sun { get; set; } public bool Mon { get; set; } public bool Sat { get; set; } } public string ConstructDays(DaysDetails d) { var week = new[] { Convert.ToInt32(d.Sat), Convert.ToInt32(d.Sun), Convert.ToInt32(d.Mon), }; return string.Join(",", week); }
Parcourez les propriétés de la classe comme:
pubic string ConstructDays(DaysDetails d) { int Idx = 0; string days = ""; var obj = new DaysDetails (); foreach (var p in obj .GetType().GetProperties()) { days += (bool)p.GetValue(obj ) ? (days=="" ? Idx.ToString() : ","+Idx.ToString()) : ""; Idx++; } return days }
Définissez une énumération d'indicateur pour stocker vos valeurs:
static public string ConstructDays(Days days) { return string.Join(",", Enum.GetValues(typeof(Days)) .Cast<Days>() .Where(d => days.HasFlag(d) && d != Days.None) .Select(d => Math.Log((int)d, 2))); // 1,3,6 }
Vous pouvez définir les jours sélectionnés comme ceci:
var days = Days.None; if (some condition) days |= Days.Mon; if (some other condition) days |= Days.Wed; if (yet another condition) days |= Days.Sat;
Et générer des valeurs en fonction des indicateurs définis comme suit:
[Flags] public enum Days { None = 0, Sun = 1, // 0 Mon = 2, // 1 Tue = 4, // 2 Wed = 8, // 3 Thu = 16, // 4 Fri = 32, // 5 Sat = 64 // 6 }
Je suggérerais deux choses: créer une méthode distincte pour convertir un booléen en représentation int et remplacer Méthode ToString au lieu de générer une méthode ConstructDays distincte.
public class DaysDetails { public bool Sun {get;set;} public bool Mon {get;set;} ... public bool Sat {get;set;} //All 7 days of the week public override string ToString() { //formatted string return $"{GetNumberRepresentationOfBool(Sun)},{GetNumberRepresentationOfBool(Mon)},{GetNumberRepresentationOfBool(Sat)}" } } public int GetNumberRepresentationOfBool(bool value) { return value ? 1 : 0 } //printing the value Console.WriteLine(dayDetailsObject.ToString());
Pour commencer, êtes-vous autorisé à modifier DaysDetails? Je veux dire, pourquoi ne pas utiliser un Enum avec des indicateurs?
vous pouvez utiliser une liste au lieu d'un champ CSV
@anu: DayDetails est ce que j'obtiens des champs mappés de l'interface utilisateur. Mais oui, je suis autorisé à utiliser toute autre variable dérivée de DayDetails et peut être passée à la fonction ConstructDays. En fin de compte, j'ai besoin d'une chaîne séparée par des virgules de DayDetails ou de toute variable personnalisée transmise à function.
Je vote pour fermer cette question comme hors sujet, car elle demande une révision du code, essayez Révision du code