2016-08-14 157 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