【问题标题】:Remove object from Collection从集合中移除对象
【发布时间】:2012-02-12 07:19:22
【问题描述】:

我有一个对象集合,我希望根据返回 true 或 false 的函数调用从中删除一些对象。请参阅下面的示例代码片段 -

for each(MyClass obj in Objects)
{
  if(!ValidateObject(obj)
  { Objects.Remove(obj); }
}

我不想在这里使用循环。上述示例需要一个班轮代码。 提前致谢。

【问题讨论】:

  • 你需要更准确。第一 - ObjectsMyClass 的集合吗? 2 - 到目前为止你尝试过什么? 3rd - 有什么问题?再说一次,如果你没有问清楚,听起来有人需要做你的功课! ;)
  • 您可能想解释“我不想在这里使用循环”背后的原因。最终,每个解决方案都需要遍历所有项目,删除不需要的内容。
  • @HansKesting 我想他的研究背后没有技术原因,只是为了减少行数。
  • 是的,Matias 在这里非常正确,我知道我们可能实施的每个解决方案都只会进行迭代。只是想让我的代码保持干净且不那么繁琐。
  • @Alok 可悲的是,这是编程。你无法避免循环,没有办法,但是你可以封装你的逻辑,这样你就可以在任何地方使用它,避免一次又一次地重复同一个循环。

标签: c# .net c#-4.0 loops collections


【解决方案1】:

RemoveAll 带有谓词的方法可以在您使用 List 时使用

public int RemoveAll(
    Predicate<T> match
)

Predicate(Of T) 委托,定义要移除的元素的条件。

 List<MyClass > f = new List<MyClass >();
 f.RemoveAll(x => ! ValidateObject(x) );

【讨论】:

  • +1,但我认为目标是删除 ValidateObject 返回 false 的对象:!ValidateObject(x)
【解决方案2】:

枚举时不能修改集合。

尝试使用 Linq:

var validObjects = Objects.Where(z => ValidateObject(z));

【讨论】:

  • [对已删除答案的回答]根据我对 OP 问题的理解,他想删除对象并且“不想在这里使用循环”。很好,这里没有使用 Linq 的循环。这就回答了这个问题。
  • 我不这么认为,Linq 也会循环。好的,Where 在一行中做了一个循环,但它又是一个循环。
  • 您的代码令人困惑,因为您的 obj 变量代表多个对象。此外,您的代码会获取有效、非无效的对象,并且不会删除它们。
  • @MatíasFidemraizer:这是对开发人员隐藏的实现细节。您将总是必须遍历您的集合以查看其中的每个项目是否有效。 RemoveAll 也是如此。
  • @MatíasFidemraizer 实际上有两种观点。第一个是“OP 想要删除无效对象”,我同意,上面的代码没有回答这个问题。第二个 POV 是“OP 希望从其集合中删除无效对象,因此其集合将仅包含有效对象”。上面的代码回答了这个问题。
【解决方案3】:

毕竟,类型为IEnumerable&lt;T&gt;ICollection&lt;T&gt; 的集合不可能根据某些条件删除项目。

但是你可以像这样创建一个扩展方法:

public static void CollectionsExtensions
{
      public static void RemoveInvalidItems(this ICollection<MyClass> some)
      {
             foreach(MyClass item in some.ToList())
             {
                    if(!new Validator().ValidateObject(item)) // Your class having your validation method
                    {
                          some.Remove(item);
                    }
             }
       }
}

因此,最终,您可以将循环以删除无效对象转换为:

someCollectionOfMyClass.RemoveInvalidItems();

总结:对于任何实现 ICollection&lt;MyClass&gt; 的集合,您可以在一行中删除所有无效项,其中包括:

  • IList&lt;T&gt;
  • List&lt;T&gt;
  • 还有更多!

【讨论】:

    【解决方案4】:

    使用它来过滤掉有效的对象:

    var validObjects = Objects.Where(t=>ValidateObject(obj));
    

    【讨论】:

    • 我没有发现使用 Linq 或 for-each 迭代器有任何区别,但它并没有解决任何问题。
    • @MatíasFidemraizer - 如果它过滤集合并且不使用循环,你能解释一下它是如何什么都不做的吗?
    • @GarryVass 是的,你是对的,我错过了“单行”的事情,但是,顺便说一句,你认为你的答案解决了“在一行中从这个集合中删除一个对象” ?
    • 毕竟,在任何 LINQ 建议中,您真的要删除此集合中的一个项目吗?您正在过滤,而不是删除!
    • @MatíasFidemraizer -> 公平观察。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多