我想弄清楚如何很好地重構這個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