我必须从数据表中删除一些行。我听说在遍历一个集合时改变它是不好的。因此,我应该首先迭代数据表并添加列表中的所有行,然后迭代列表并将行标记为删除,而不是使用for循环检查行是否满足删除要求。这样做的原因是什么,我有什么替代方法(我的意思是不使用行列表)?
发布于 2008-11-21 11:29:45
如果使用简单的for循环,则可以从集合中移除元素。
看一下这个例子:
var l = new List<int>();
l.Add(0);
l.Add(1);
l.Add(2);
l.Add(3);
l.Add(4);
l.Add(5);
l.Add(6);
for (int i = 0; i < l.Count; i++)
{
if (l[i] % 2 == 0)
{
l.RemoveAt(i);
i--;
}
}
foreach (var i in l)
{
Console.WriteLine(i);
}发布于 2008-11-21 14:02:29
向后迭代列表听起来是一种更好的方法,因为如果删除一个元素和其他元素“落入间隙”,这并不重要,因为您已经查看过这些元素。此外,您也不必担心计数器变量会比.Count更大。
List<int> test = new List<int>();
test.Add(1);
test.Add(2);
test.Add(3);
test.Add(4);
test.Add(5);
test.Add(6);
test.Add(7);
test.Add(8);
for (int i = test.Count-1; i > -1; i--)
{
if(someCondition){
test.RemoveAt(i);
}
}发布于 2008-11-22 06:19:38
以@bruno代码为例,我会倒过来做。
因为当您向后移动时,缺少的数组索引不会干扰循环的顺序。
var l = new List<int>(new int[] { 0, 1, 2, 3, 4, 5, 6 });
for (int i = l.Count - 1; i >= 0; i--)
if (l[i] % 2 == 0)
l.RemoveAt(i);
foreach (var i in l)
{
Console.WriteLine(i);
}但严肃地说,这些天,我会使用LINQ:
var l = new List<int>(new int[] { 0, 1, 2, 3, 4, 5, 6 });
l.RemoveAll(n => n % 2 == 0);https://stackoverflow.com/questions/308466
复制相似问题