我在這裏遇到了一個問題,最近我發現了一個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'。使用探查器確定,然後根據測量進行優化。一旦你這樣做了,下面的字典建議應該會有幫助,如果它變成嵌套循環。 –