Estoy intentando descubrir cómo refactorizar este código LINQ. Este código y otro código similar se repite dentro del mismo archivo y en otros archivos. En algún momento, los datos que se manipulan son idénticos y, a veces, los datos cambian y la lógica sigue siendo la misma.Cómo refactorizar este código LINQ duplicado?
Aquí hay un ejemplo de lógica duplicada que opera en diferentes campos de diferentes objetos.
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
};
}
¿Alguien tiene una buena manera de refactorizar esto?
¿Los nombres de las propiedades en 'FooDataItem' tienen que ser diferentes? La solución sería más simple si fueran más genéricos, p. 'Key',' Total', 'Porcentage'. –
+1 Si esta es una representación exacta, sus métodos son pequeños y hacen exactamente lo que cabría esperar. ¿Quizás haya otras partes de tu código que se beneficiarían de la refactorización primero? –