2012-01-17 89 views
1

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

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

我不想在这里使用循环。需要一个以上样本的班轮码。 在此先感谢。

+0

你需要更加准确。 1st - “Objects”是“MyClass”的集合吗?第二 - 你到目前为止尝试过什么?第三 - 有什么问题?再说一遍,如果你没有清楚地问问题,那听起来好像有人需要做你的功课! ;) – 2012-01-17 13:32:10

+1

你可能想解释“我不想在这里使用循环”的原因。最终,每个解决方案都需要遍历所有项目,删除不需要的内容。 – 2012-01-17 13:52:21

+0

@HansKesting我想他的研究背后没有任何技术原因,只是以较少的行数来完成。 – 2012-01-17 14:09:47

回答

3

枚举枚举时无法修改集合。

尝试使用LINQ:

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

[回答已删除的答案]从我从OP的问题中了解到的情况,他想删除对象并且“不想在此使用循环”。 好,这里没有使用Linq的循环。这回答了这个问题。 – ken2k 2012-01-17 13:36:16

+0

我不这么认为,Linq也会循环。好吧,'Where'在单行中做了一个循环,但它又是一个循环。 – 2012-01-17 13:46:30

+0

你的代码很混乱,因为你的obj变量代表了多个对象。此外,您的代码获取有效的对象,而不是无效的,并且不会删除它们。 – 2012-01-17 13:46:53

0

使用此过滤出有效对象:

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

我没有发现使用Linq或'for-each'迭代器的任何区别,它没有解决任何问题。 – 2012-01-17 13:34:25

+0

@MatíasFidemraizer - 你可以解释一下,如果它过滤了集合并且没有使用循环,它怎么样? – 2012-01-17 13:42:16

+0

@GarryVass是的,你是对的,我错过了“单行”的事情,但顺便说一下,你认为你的答案能够解决“在一行中删除一个对象从这个集合中”? – 2012-01-17 13:44:15

5

,如果你使用的是列表

public int RemoveAll(
    Predicate<T> match 
) 
RemoveAll法断言会做

The Predicate(Of T)代表它定义了要移除的元素的条件。

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

+1,但我认为目标是移除ValidateObject返回false的对象:!ValidateObject(x) – 2012-01-17 13:39:55

+0

@Meta - 我刚纠正它:) – 2012-01-17 13:40:14

1

毕竟,有没有办法,它的类型是IEnumerable<T>ICollection<T>左右可以消除基于某些条件的项目集合。

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

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<MyClass>任何集合,其中包括一些像:

  • IList<T>
  • List<T>
  • 以上!