2010-11-04 45 views
0

删除的对象我想从一个集合中删除的对象,如果对象一点儿也不满足一定条件从集合

 foreach (var data in infData) 
      { 
      if(data.Id==0) 
      { 
       //Remove this object from the collection 
      } 
      } 

如何做到这一点。

编辑:这是完整的代码

foreach (var data in infData) 
     { 
      //Validate Offence Code 
      IQueryable<Ref_OffenceCode> allRows = dbContext.Ref_OffenceCode; 
      if (allRows.Where(p => p.Code == data.offenceCode && p.StartDate<=data.offenceDate).Count() == 0) 
      { 
       invalidCount += 1; 
      } 

      //Validate Location Code 
      //IQueryable<Ref_OffenceCode> allRows = dbContext.Ref_OffenceCode; 
      if (invalidCount != 0) 
      { 
       infData.Remove(data); 
      } 
     } 
+2

你是如何做到这一点取决于你正在使用什么特定类型的集合。 – LukeH 2010-11-04 10:50:22

+0

如果通过“收集”你的意思是IEnumerable,你不能。 infData的类型是什么? – 2010-11-04 10:51:05

+0

这不是完整的代码,它不会编译。 – mike 2010-11-04 11:19:25

回答

5

相反从集合中删除对象,您可以创建一个新的过滤集合:

var filteredList = infData.Where(x => x.Id != 0); 

并且在GC超出范围时离开GC处理旧收集。你也在你的文章中提到了ArrayList。除非您使用.NET 1.1或更高版本,否则绝对没有理由使用ArrayList。通用集合会更合适。

+0

谢谢,我正在使用一个通用的集合。请参阅编辑部分中的完整代码 – 2010-11-04 10:56:50

+0

您最好调用'ToList()',否则您仍将引用原始集合,并会看到后续修改,这也许是您不想要的。 – leppie 2010-11-04 10:58:10

3

List做到这一点:

infData = infData.RemoveAll(p => p.Id == 0) 

和一般你可以做到这一点(对于枚举):

enumerable = enumerable.Except(enumerable.Where(p => p.Id == 0)); 
+0

这适用于'List ',但OP没有说明他们正在使用什么特定类型的集合。 – LukeH 2010-11-04 10:51:38

+0

@LukeH,你说得对,我只是更新了答案。 – 2010-11-04 10:57:33

+0

我喜欢.Except()。不要经常使用它。 +1 – 2010-11-04 14:55:15

1

如果您想从集合中删除项目(因为您在迭代集合的同时修改集合),请不要使用foreach

您可以使用基于索引的方法,但回想一下集合大小会改变。如果你只需要删除一个项目,你可以这样做:

for (int i = 0; i < infData.Count; i++) 
{ 
    if(infData[i].Id==0) 
    { 
    infData.RemoveAt(i); 
    break; 
    } 
} 

由于@Stefano评论,你可以向后迭代,然后你不需要打破(可以删除多个项目):

for (int i = infData.Count - 1; i >= 0 ; i--) 
{ 
    if(infData[i].Id==0) 
    { 
    infData.RemoveAt(i); 
    } 
} 
+1

此解决方案的另一个选择是倒计数,而不是:for(int i = data.count; i> 0; i--)。但我更喜欢建立一个新的集合 – 2010-11-04 10:54:37

+0

应斯特凡诺说,没有休息。 (但我= data.count -1不算) – 2010-11-04 10:58:42

+0

@Downvoter - 谨慎解释?我的回答有什么不正确? – Oded 2010-11-04 11:02:53