2016-08-14 51 views
0

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

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

嗯,我的问题是他们做了一个双循环研究使用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没有很长的一套元素,但我敢肯定,我将不得不在其他项目中使用这种优化在其他项目中使用相同的逻辑。

请大家,稍微备份会是apreciated,有没有可能做得更快?


所以,我们走了,你认为什么人,这是好吗?

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); 
    } 
} 

编辑:16/08/2016 - >目前没有工作,首先,我当我试图访问该字典的值烦恼,让我在不同的变量附上了Id和姓名,我认为应该这样做,但我不确定。

但是后来我遇到了这个问题,只是在字典数据的内容中做了一轮,似乎很明显,但我认为这样会工作,但可悲的是,它没有。


我尝试使用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。

仍然存在严重的优化问题。

+0

我有兴趣了解一下profiler在这里说的。你假定嵌套循环是问题,但是这个代码中有很多机会会导致效率低下,并且很难在没有看到什么是可测量的情况下给出一个好的答案。 –

+0

当我调试的时候,我第一次猜测它是缓存,但后来我在寻找断点,因为项目花费了更多的时间来处理加载内容,并且我将这个contentService分离出来,foreach循环必须检查listWeek和我的集合对象,它需要太长的时间才能获得我需要它的正确内容的文章集合。但是,你说的没错,可能还有很多其他的麻烦,我是这个部门的新成员,从​​2013年开始这个项目开始,只需要一个多月的时间就能获得支持!我认为它有多大的想法。 – dato000

+0

了解 - 但您不确定它是嵌套循环,还是可能是'TaxonExists'方法,或者甚至是调用'articles.Add'。使用探查器确定,然后根据测量进行优化。一旦你这样做了,下面的字典建议应该会有帮助,如果它变成嵌套循环。 –

回答

-1

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

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

接下来,遍历myCollection因为你现在用的方法做,以找到Dictionary类。

+0

为什么不使用'LINQ JOIN'因为无论你使用的是LINQ? – Rahul

+0

当然,可以使用LINQ JOIN,但我觉得主要的优化可以通过将两个循环减少为1来实现。 –

+0

这假定可以保存字典。每次这个例程运行时重新生成字典可能比首先执行嵌套循环要慢。 –

0

这段代码效率很低,这是肯定的。

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

更好的方法是循环动态内容项目的集合(仅一次)并检查项目是否具有类别。如果是这样,那么使用分类标准管理器找到分类单元并获取其名称/标题并将其分配给动态内容。

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

+0

容易说出朋友,你是绝对正确的,但你知道,我的老板说过,然后说,去做你的代码......但问题是,我不知道该怎么做,我必须检查所有的集合,动态内容和分类法看到我的问题,我正在考虑在内部循环中放置一个中断,但是我不能这么做,因为我会在文章循环中添加更少的项目,看看我不懒,只是我在这个优化的东西中是相对较新的。另外,我们都知道优化是一项非常困难的任务。另外,我想澄清,我必须检查类别和作者属性才能添加文章。 – dato000

+0

Dammit我无法编辑,我不得不说,你是对的,在得到类别名称后,我必须继续为该文章的作者姓名作出登记,然后将该项目添加到我的第三个列表“文章”中。那么事情是,有可能在一个循环中检查整个两个集合“listWeek”和“myCollection”?我知道我可以在这些循环中添加Linq来同时检查“if”条件,但我认为这在性能方面甚至是最差的。 – dato000