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