我在这里遇到了一个问题,最近我发现了一个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。
仍然存在严重的优化问题。
我有兴趣了解一下profiler在这里说的。你假定嵌套循环是问题,但是这个代码中有很多机会会导致效率低下,并且很难在没有看到什么是可测量的情况下给出一个好的答案。 –
当我调试的时候,我第一次猜测它是缓存,但后来我在寻找断点,因为项目花费了更多的时间来处理加载内容,并且我将这个contentService分离出来,foreach循环必须检查listWeek和我的集合对象,它需要太长的时间才能获得我需要它的正确内容的文章集合。但是,你说的没错,可能还有很多其他的麻烦,我是这个部门的新成员,从2013年开始这个项目开始,只需要一个多月的时间就能获得支持!我认为它有多大的想法。 – dato000
了解 - 但您不确定它是嵌套循环,还是可能是'TaxonExists'方法,或者甚至是调用'articles.Add'。使用探查器确定,然后根据测量进行优化。一旦你这样做了,下面的字典建议应该会有帮助,如果它变成嵌套循环。 –