首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在C#中循环访问可枚举集合时修改或删除其中的项

如何在C#中循环访问可枚举集合时修改或删除其中的项
EN

Stack Overflow用户
提问于 2008-11-21 11:21:12
回答 8查看 33.7K关注 0票数 38

我必须从数据表中删除一些行。我听说在遍历一个集合时改变它是不好的。因此,我应该首先迭代数据表并添加列表中的所有行,然后迭代列表并将行标记为删除,而不是使用for循环检查行是否满足删除要求。这样做的原因是什么,我有什么替代方法(我的意思是不使用行列表)?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2008-11-21 11:29:45

如果使用简单的for循环,则可以从集合中移除元素。

看一下这个例子:

代码语言:javascript
复制
        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);
        }
票数 18
EN

Stack Overflow用户

发布于 2008-11-21 14:02:29

向后迭代列表听起来是一种更好的方法,因为如果删除一个元素和其他元素“落入间隙”,这并不重要,因为您已经查看过这些元素。此外,您也不必担心计数器变量会比.Count更大。

代码语言:javascript
复制
        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);
            }
        }
票数 88
EN

Stack Overflow用户

发布于 2008-11-22 06:19:38

以@bruno代码为例,我会倒过来做。

因为当您向后移动时,缺少的数组索引不会干扰循环的顺序。

代码语言:javascript
复制
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:

代码语言:javascript
复制
var l = new List<int>(new int[] { 0, 1, 2, 3, 4, 5, 6 });

l.RemoveAll(n => n % 2 == 0);
票数 33
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/308466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档