2017-09-13 76 views
1

一個LINQ查詢(而不是子查詢),我有這樣的代碼:列表和字典在C#

for (int i = 0; i < _smartBoostItems.Count; i++) 
{ 
    foreach (var condition in _levelConditionsDict) 
    { 
     if (_smartBoostItems[i].progression_to_finish >= level.PercentsLeftToLevelCompleteWhileTurnType 
      && _smartBoostItems[i].condition 
      && _smartBoostItems[i].condition_id == condition.Key) 
     { 
      _availibleSmartBoosts.Add(_smartBoostItems[i]); 
     } 
    } 
}  

_smartBoostItems - 這是一個List<SmartBoostLibItem>
_levelConditionsDict - 這是一個Dictionary<int, int>

我怎麼能這個代碼轉換爲一個linq查詢?或者它會變得更糟?我不喜歡這個嵌套循環,沒有太多元素。將會有大約500次迭代。

+1

即使LINQ將使用循環,你就不會看到他們 –

+0

能否請您解釋一下你的代碼是意欲何爲?我們這樣做是免費的,而且這會讓我們更容易通過代碼進行瀏覽。 –

+0

無論你把什麼花哨的框架放在你的​​代碼上,你仍然需要評估所有項目的組合。除非存在性能問題,否則您應該問''更容易閱讀和維護什麼?「如果存在性能問題,那麼您需要詢問如何在不檢查所有所有組合的情況下獲得相同信息這幾項。 – user1304444

回答

2

您可以使用此查詢這是更有效的:

_availibleSmartBoosts = _smartBoostItems 
    .Where(i=> i.progression_to_finish >= level.PercentsLeftToLevelCompleteWhileTurnType 
      && i.condition && _levelConditionsDict.ContainsKey(i.condition_id)) 
    .ToList(); 
+0

這樣做的一個好處是,如果第一個條件是錯誤的,它將會短路,因此ContainsKey不必執行。 –

+0

@YairHalberstadt來自原始問題的「if」陳述也會在滿足的第一個條件中跳過,這是不正確的。 – user1304444

+0

謝謝,這是我一直在尋找。 –