是否可以使用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++;
}
}
}
答案 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}}项的索引,获得较小的allHits
和List<int>
,然后在Count
循环中进行分配:
newHits.Count