我想弄清楚如何很好地重构这个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”中的属性名必须不同吗?如果更通用的话,解决方案会更简单。 '钥匙','总计','百分比'。 – 2010-06-03 14:01:57
+1如果这是一个确切的表示,那么你的方法很小,并做你期望的。也许你的代码的其他部分会首先受益于重构? – 2010-06-03 14:03:55