Я пытаюсь понять, как правильно реорганизовать этот код LINQ. Этот код и другие подобные коды повторяются в одном файле, а также в других файлах. Когда-то обрабатываемые данные идентичны, и иногда данные меняются, а логика остается неизменной.Как реорганизовать этот дублированный код LINQ?
Вот пример дублированной логики, работающей в разных полях разных объектов.
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
};
}
У кого-нибудь есть хороший способ рефакторинга?
Должны ли названия свойств в 'FooDataItem' быть разными? Решение было бы проще, если бы они были более универсальными, например. 'Key',' Total', 'Percentage'. –
+1 Если это точное представление, то ваши методы малы и делают именно то, что вы ожидаете. Может быть, есть другие части вашего кода, которые в первую очередь выиграют от рефакторинга? –