一个linq查询(非子查询)中的列表和字典c#

一个linq查询(非子查询)中的列表和字典c#,c#,linq,C#,Linq,我有以下代码: for (int i = 0; i < _smartBoostItems.Count; i++) { foreach (var condition in _levelConditionsDict) { if (_smartBoostItems[i].progression_to_finish >= level.PercentsLeftToLevelCompleteWhileTurnType &&

我有以下代码:

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]);
        }
    }
}    
for(int i=0;i<\u smartBoostItems.Count;i++)
{
foreach(在_levelConditionsDict中的var条件)
{
如果(\u smartBoostItems[i].progression\u to\u finish>=level.PercentsLeftToLevelComplete whileTurnType
&&_smartBoostItems[i]。条件
&&_smartBoostItems[i]。条件_id==条件.Key)
{
_availibleSmartBoosts.Add(_smartBoostItems[i]);
}
}
}    
\u smartBoostItems
-它是一个
列表

\u levelConditionsDict
-这是一本
字典


如何将此代码转换为linq查询?或者情况会更糟?我不喜欢这种嵌套循环,没有太多的元素。将有大约500次迭代。

您可以使用更高效的查询:

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

即使LINQ会使用循环,你也看不到它们。你能解释一下你的代码要做什么吗?我们这样做是免费的,这将使我们更容易阅读您的代码。无论您在代码上添加了什么花哨的框架,您仍然必须评估所有项目的组合。除非存在性能问题,否则您应该询问
“什么更易于阅读和维护?”
如果存在性能问题,那么您需要询问如何在不检查所有项目的所有组合的情况下获得相同的信息。这样做的一个好处是,如果第一个条件为假,则会短路,所以ContainsKey将不必执行。@YairHalberstadt原始问题中的
if
语句也将在它满足的第一个条件时跳过,这是不正确的。谢谢,这是我一直在寻找的。