我正在生成一个用于jQuery的表,可视化插件并生成一个图表。代码很好,但是也许有一个方法来改进它。也许在LINQ查询上做更多的工作,在其余的代码上做更少的工作。
这个想法是获取每个区域的每一个内容和它们的发布日期。将所有日期和当天发布的内容数量分开。但也许还有更好的方法。有没有人?
下面是我使用的方法:
public KeyValuePair<DateTime[], List<KeyValuePair<string, int[]>>> TimeGrowth(int days, params string[] locales)
{
DateTime startdate = DateTime.Today.AddDays(days * (-1));
var qry = from r in GlobalVariables.Regions
where locales.Contains(r.ID)
select new
{
Region = r,
Launches = (from d in r.RegionalContents
where d.RegionId == r.ID && d.PublishDate != null
group d by d.PublishDate into groupeddates
select new
{
Date = groupeddates.Key,
Count = groupeddates.Count()
}).OrderBy(x => x.Date)
};
var regions = qry.ToArray();
var dates = new List<DateTime>();
var datesbeforestart = new List<DateTime>();
var countries = new List<KeyValuePair<string, int[]>>();
for (int i = 0; i < regions.Length; i++)
{
for (int j = 0; j < regions[i].Launches.Count(); j++)
{
var data = regions[i].Launches.ElementAt(j).Date.Value;
if (data > startdate)
dates.Add(data);
else
datesbeforestart.Add(data);
}
}
dates = dates.Distinct().OrderBy(x => x.Date).ToList();
for (int i = 0; i < regions.Length; i++)
{
var values = new int[dates.Count];
values[0] = CountDateInterval(datesbeforestart.Min(), startdate, regions[i].Region.ID);
int acum = values[0];
for (int j = 1; j < dates.Count; j++)
{
int valor = 0;
if (regions[i].Launches.Any(x => x.Date == dates[j]))
valor = regions[i].Launches.Single(x => x.Date == dates[j]).Count;
acum += valor;
values[j] = acum;
}
var country = new KeyValuePair<string, int[]>(regions[i].Region.CountryEnglish, values);
countries.Add(country);
}
countries = countries.OrderByDescending(x => x.Value.Max()).ToList();
var finalresult = new KeyValuePair<DateTime[], List<KeyValuePair<string, int[]>>>(dates.ToArray(), countries);
return finalresult;
}您可以在最后一个图表上看到实际运行的代码:http://programad.net/xbltoolsv2beta/Stats
发布于 2012-01-27 18:09:39
以下是几点一般性意见:
(1) GlobalVariables.Regions --我不知道您的应用程序有多大,但是如果我查看一个代码库,看到一些名为"GlobalVariables“的静态类,这通常会让我产生怀疑。在纯面向对象的语言中,所有数据都可以(而且可以说应该是)与某个对象相关联。一个包含大量静力学的GlobalVariables类可能会随着应用程序的增长(和rot )而增长和腐烂。
(2)正如Lars-Erik所提到的,我认为将某些功能分解为其他方法是有益的。就我个人而言,我会查看控制语句,特别是嵌套语句,以寻找这样做的机会。查看您的代码,for (int i = 0; i < regions.Length; i++)内部的逻辑将是一个很好的候选。通过随意查看代码,很难分辨出循环中发生了什么。但是,如果您将它提取到一个方法中,并给它一个描述性的名称,那么查看您的代码的人可以很容易地理解循环所做的事情。
(3)对于Foo.Bar().Baz().Rebar();这样的语句序列,您有很多代码( Linq倾向于这样)--一般来说,如果这些序列链中的任何内容返回null,您将得到空引用异常。该方法的客户端可能处理它生成的异常,但我看不出您正在处理该方法中的“愉快路径”。如果事情不期而至会发生什么?
https://codereview.stackexchange.com/questions/8286
复制相似问题