C#Double Foreach优化

时间:2016-08-14 14:41:40

标签: c# loops optimization foreach

我在这里遇到了一个问题,最近我发现这个问题与一个Web项目(在Sitefinity中创建),当我试图获得一个完整的文章列表,我需要在缓存中添加以便更快地访问。

我发现一些天才开发者XD用来获得属于Taxon中存在的特定类别的文章的整个列表(sitefinity的某些属性识别出类别类别ex:怀孕 - 婴儿 - 孩子......你得到了这个想法),并且必须在带有动态内容的项目集合中进行一些搜索,其中包含有关文章(标题,图像,样式,文本)的信息。

嗯,我的问题是他们使用ForEach进行了双循环研究,并且我的老板想要“优化”那个循环,因为当然,这个循环需要太长时间(有时它可能更多)超过3或4分钟,是的,我的老板想要立即完成这个过程:))。

这是代码:

   foreach (HierarchicalTaxon subt in listWeek)
   {
       foreach (DynamicContent item in myCollection)
       {
            if (item.Organizer.TaxonExists("Category", subt.Id))
            {
                 item.Author = subt.Name;
                 //if (articles.Where(art => art.Author.Equals(item.Author)).Count() == 0)
                 articles.Add(item);
            }
       }
   }

所以我必须处理这个具有2 ^ n实现的双循环,我的问题是,我该怎么做?!?!?!

我正在考虑在其他线程中添加一些LINQ,但它似乎比实际代码慢得多。

看起来myCollection没有很长的元素集,但我很确定我必须在其他项目中使用相同逻辑的其他句子中进行这种优化。

请大家,有点备份会有所回复,有没有可能做得更快?

所以我们走了,你觉得伙计们,这个好吗?

var data = listWeek.ToDictionary(x => x.Id, x => x.Name);
var iDdata = data.Keys;
var nombresData = data.Values;

foreach (DynamicContent item in myCollection)
{
    if (item.Organizer.TaxonExists("Category", iDdata.First()) )
    {
        item.Author = nombresData.First();
        articlesPrueba1.Add(item);
    }
}

编辑:2016年8月16日 - >目前还没有工作,首先,当我试图访问字典的值时,我遇到了麻烦,所以我附加了Id和Name的单独变量,我认为应该这样做,但我不确定

但后来我遇到了这个问题,只是在字典数据的内容中进行了一轮,这似乎是显而易见的,但我认为这有用,但遗憾的是,它没有。

我试图使用LINQ:

 foreach (HierarchicalTaxon subt in listWeek)
 {
    foreach (DynamicContent item in myCollection.Where(item => item.Organizer.TaxonExists("Category", subt.Id)))
    {
        item.Author = subt.Name;
        articlesPrueba2.Add(item);
        }
    }
 }

但是我得到了关于查询没有访问数据库的例外,该死的你是Sitefinity,我恨你......但是没关系,我真的不关心LINQ。

仍处于严重的优化问题中。

2 个答案:

答案 0 :(得分:0)

这段代码非常低效,这是肯定的。

从我可以从代码中获取的内容,您基本上想要检查动态内容项是否具有类别,如果是,请获取该类别的名称并将其分配给作者属性。

更好的方法是循环动态内容项的集合(仅一次)并检查该项是否具有类别。如果是,则使用Taxonomy Manager找到分类单元并获取其名称/标题并将其分配给动态内容。

这样,您必须循环收集一次,然后仅在需要时查询分类。

答案 1 :(得分:-1)

您可以通过以ID和Name的KeyValue对形式将上周转换为Dictionary来优化代码。

 var data = listWeek.ToDictionary(x => x.Id, x => x.Name);

接下来,使用从字典中查找类别的方法,正如您现在所做的那样迭代myCollection