从集合中删除对象

时间:2010-11-04 10:47:35

标签: c# .net collections

我想从对象的集合中删除一个对象不满足某些条件

      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);
            }
        }

3 个答案:

答案 0 :(得分:5)

您可以创建新的过滤集合,而不是从集合中删除对象:

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

并且当GC超出范围时,让GC处理旧的集合。你也在帖子中提到了ArrayList。除非您使用的是.NET 1.1或更早版本,否则绝对没有理由使用ArrayList。通用集合更合适。

答案 1 :(得分:3)

List执行此操作:

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

一般情况下你可以这样做(可枚举):

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

答案 2 :(得分: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);
  }
}