【问题标题】:What is the easiest way to foreach through a List<T> removing unwanted objects?通过 List<T> 删除不需要的对象的最简单方法是什么?
【发布时间】:2009-07-13 15:55:11
【问题描述】:

在我的应用程序中,_collection 是一个列表,我需要从中删除所有与条件不匹配的用户对象

但是,由于 _collection 本身已更改,以下代码在第二次迭代中出现无效操作错误:

foreach (User user in _collection)
{
    if (!user.IsApproved())
    {
        _collection.Remove(user);
    }
}

我可以创建另一个 List 集合并来回复制它们,但是我遇到了非克隆引用类型等问题。

有没有比将 _collection 复制到另一个 List 变量更优雅的方法?

【问题讨论】:

    标签: c# .net generics list collections


    【解决方案1】:
    _collection.RemoveAll(user => !user.IsApproved());
    

    如果您仍然在 2.0:

    _collection.RemoveAll(delegate(User u) { return !u.IsApproved(); });
    

    顺便说一句,如果您不想接触原始列表,您可以通过以下方式获取另一个已批准用户列表:

    _collection.FindAll(user => user.IsApproved());
    

    【讨论】:

    • _collection.FindAll(user =&gt; user.IsApproved()); 消除否定。
    • _collection.FindAll 将返回 另一个 集合。这与更改初始集合完全不同(在某些情况下,其他一些对象持有对同一列表的引用,而您需要更改一个,而不是创建另一个)。
    【解决方案2】:

    您始终可以从顶部索引开始向下迭代到 0:

    for (int i = _collection.Count - 1; i >= 0; i--)
    {
        User user = _collection[i];
        if (!user.IsApproved())
        {
            _collection.RemoveAt(i);
        }
    }
    

    不过,Mehrdad 的回答看起来非常优雅。

    【讨论】:

    • 这似乎包含一个错误。考虑具有两个元素的集合的情况,其中第一个元素未被批准。第一个被删除,因此 collection[1] 超出范围。
    • Steven:如果您描述上述代码,则已经检查了 collection[1](删除 collection[0] 后成为 collection[0]),因为它是自上而下迭代的。所以不应该有任何越界错误。
    • 没关系。再走一遍,你会发现没问题。
    • 对于我们这些仍在使用 .NET 2.0 的人来说,这种方法是可行的方法。
    • @C-Pound Guru:List&lt;T&gt;.RemoveAll 从 2.0 开始就存在:list.RemoveAll(delegate(User u) { return !u.IsApproved(); });
    【解决方案3】:

    只要有可能在循环中修改集合,请选择for 循环。 Mehrdad 给出的解决方案很可爱,绝对值得一试!

    以下代码在处理可修改集合时我觉得很有帮助:

    for(int index=0;index < _collection.Count; index++)
    {
        if (!_collection[index].IsApproved)
        {
            _collection.RemoveAt(index);
            index--;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-11
      • 2011-11-12
      • 1970-01-01
      相关资源
      最近更新 更多