首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LINQ生成图

LINQ生成图
EN

Code Review用户
提问于 2012-01-25 18:34:29
回答 1查看 1.4K关注 0票数 4

我正在生成一个用于jQuery的表,可视化插件并生成一个图表。代码很好,但是也许有一个方法来改进它。也许在LINQ查询上做更多的工作,在其余的代码上做更少的工作。

这个想法是获取每个区域的每一个内容和它们的发布日期。将所有日期和当天发布的内容数量分开。但也许还有更好的方法。有没有人?

下面是我使用的方法:

代码语言:javascript
复制
    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

EN

回答 1

Code Review用户

发布于 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,您将得到空引用异常。该方法的客户端可能处理它生成的异常,但我看不出您正在处理该方法中的“愉快路径”。如果事情不期而至会发生什么?

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/8286

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档