2017-09-13 10 views
1

C 1つのLINQクエリ(ないサブクエリ)で、私はこのコードを持っている:リストと辞書#

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

これの利点の1つは、最初の条件が偽である場合に短絡するため、ContainsKeyを実行する必要がないことです。 –

+0

@ YairHalberstadt元の質問の 'if'ステートメントは、それが満たされない最初の条件でもスキップされます。 – user1304444

+0

ありがとう、それは私が探していた。 –