J'essaie de comprendre comment refactoriser correctement ce code LINQ. Ce code et d'autres codes similaires se répètent dans le même fichier ainsi que dans d'autres fichiers. Parfois, les données manipulées sont identiques et parfois les données changent et la logique reste la même.Comment refactoriser ce code LINQ dupliqué?
Voici un exemple de logique dupliquée fonctionnant sur différents champs d'objets différents.
public IEnumerable<FooDataItem> GetDataItemsByColor(IEnumerable<BarDto> dtos)
{
double totalNumber = dtos.Where(x => x.Color != null).Sum(p => p.Number);
return from stat in dtos
where stat.Color != null
group stat by stat.Color into gr
orderby gr.Sum(p => p.Number) descending
select new FooDataItem
{
Color = gr.Key,
NumberTotal = gr.Sum(p => p.Number),
NumberPercentage = gr.Sum(p => p.Number)/totalNumber
};
}
public IEnumerable<FooDataItem> GetDataItemsByName(IEnumerable<BarDto> dtos)
{
double totalData = dtos.Where(x => x.Name != null).Sum(v => v.Data);
return from stat in dtos
where stat.Name != null
group stat by stat.Name into gr
orderby gr.Sum(v => v.Data) descending
select new FooDataItem
{
Name = gr.Key,
DataTotal = gr.Sum(v => v.Data),
DataPercentage = gr.Sum(v => v.Data)/totalData
};
}
Quelqu'un at-il un bon moyen de refactoriser cela?
Est-ce que les noms de propriété dans 'FooDataItem' doivent être différentes? La solution serait plus simple si elles étaient plus génériques, par ex. 'Key',' Total', 'Pourcentage'. –
+1 Si c'est une représentation exacte, alors vos méthodes sont petites et font exactement ce que vous attendez. Peut-être que d'autres parties de votre code pourraient bénéficier d'une refactorisation en premier? –