我想从对象的集合中删除一个对象不满足某些条件
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);
}
}
答案 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);
}
}