Cod*_*r 2 2 c# arrays .net-2.0
嗨,我正在研究一些遗留代码
for(int i = results.Count-1; i >= 0; i--)
{
if(someCondition)
{
results.Remove(results[i]);
}
}
Run Code Online (Sandbox Code Playgroud)
对我来说,在迭代循环的同时删除元素似乎是不好的做法,因为你将修改索引.
这是正确的假设吗?
有没有更好的方法呢?我想使用LINQ,但我在2.0 Framework中
Bro*_*ass 12
删除实际上是正确的,因为您将向下归零,只有您已经传递的索引才会被修改.这段代码实际上会因为另一个原因而中断:它开始于results.Count,但应该results.Count -1从数组索引从0开始.
for(int i = results.Count-1; i >= 0; i--)
{
if(someCondition)
{
results.RemoveAt(i);
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:
正如所指出的那样 - 你实际上必须处理伪代码中的某种List.在这种情况下,它们在概念上是相同的(因为列表在内部使用数组),但如果使用数组,则您具有Length属性(而不是Count属性),并且您无法添加或删除项.
使用列表上面的解决方案当然简洁,但对于必须维护代码的人来说可能并不容易理解(即特别是向后遍历列表) - 另一种解决方案可能是首先识别要删除的项目,然后在第二次删除那些项目.
只需替换MyType您正在处理的实际类型:
List<MyType> removeItems = new List<MyType>();
foreach(MyType item in results)
{
if(someCondition)
{
removeItems.Add(item);
}
}
foreach (MyType item in removeItems)
results.Remove(item);
Run Code Online (Sandbox Code Playgroud)