使用select()代替foreach循环

时间:2019-02-13 19:26:07

标签: c# linq

是否可以使用linq select简化此代码

我想从列表中删除一些项目,并将新项目添加到具有相同索引的列表中。下面的代码有效。.我正在检查是否可以使用LINQ select语句而不是foreach简化此操作。

if (newHits.Any())
{
    int newHitIndex = 0;
    foreach (var h in allHits.ToList())
    {
        if (h.Type == type)
        {
            var index = allHits.FindIndex(a => a.Hit == h.Hit);
            var newHit = newHits[newHitIndex];
            allHits.RemoveAt(index);
            allHits.Insert(index, newHit);
            newHitIndex++;
        }
    }
}

2 个答案:

答案 0 :(得分:0)

if (newHits.Any())
{
    int newHitIndex = 0;
    var allHitsList = allHists.ToList();
    for(var index =0; index < allHitsList.Count; ++index)
    {
        var h = allHitsList[index]
        if (h.Type == type)
        {
            var newHit = newHits[newHitIndex];
            allHitsList[index] = newHit;
            newHitIndex++;
        }
    }
}

然后将allHitsList转换为allHits类型。

答案 1 :(得分:0)

我认为这是相同的代码,但是通过首先选择索引,然后过滤掉Type是我们关心的项目,对其进行了略微的简化。我们还删除了if (newHits.Any()),因为这并不是防止我们从allHits中选择比newHits包含更多项目的保护措施(在原始代码中,我们盲目地增加并使用{ {1}},而无需检查newHitIndex的范围。

看看这是否对您有用:

newHits

另一种方法是选择要更改为int newHitIndex = 0; foreach (var index in allHits.Select((item, index) => index) // Select the index .Where(i => allHits[i].Type == type)) // Filter on Type { if (newHitIndex == newHits.Count) break; // Stop when we get to the end of newHits allHits[index] = newHits[newHitIndex++]; // Set value and increment in one line } 的{​​{1}}项的索引,获得较小的allHitsList<int> ,然后在Count循环中进行分配:

newHits.Count