根据条件从列表中删除项目
public struct stuff { public int ID; public int quan; }
我想删除ID
= 1的产品。目前我正在尝试:
prods.Remove(new stuff{ prodID = 1});
它不工作。
谢谢大家
使用linq:
prods.Remove( prods.Single( s => s.ID == 1 ) );
也许你甚至想使用SingleOrDefault()
并检查元素是否存在…
编辑:
由于stuff
是一个结构体, SingleOrDefault()
不会返回null。 但是它会返回默认(东西) ,这将有一个ID为0.当你没有一个普通的东西对象的ID为0,你可以查询这个ID:
var stuffToRemove = prods.SingleOrDefault( s => s.ID == 1 ) if( stuffToRemove.ID != 0 ) { prods.Remove( stuffToRemove ); }
如果你的集合types是一个List<stuff>
,那么最好的方法可能是:
prods.RemoveAll(s => s.ID == 1)
这只是一个传递(迭代)的列表,所以应该比其他方法更有效率。
如果您的types更一般地是ICollection<T>
,那么如果您关心性能,可能会写一个简短的扩展方法。 如果没有,那么你可能会逃避使用LINQ(调用Where
或Single
)。
如果你有LINQ:
var itemtoremove = prods.Where(item => item.ID == 1).First(); prods.Remove(itemtoremove)
prods.Remove(prods.Single(p=>p.ID == 1));
正如文森特所build议的那样,你不能按照习惯来修改collections
你可以使用Linq。
var prod = from p in prods where p.ID != 1 select p;
你只能删除你有参考的东西。 所以你将不得不search整个列表:
stuff r; foreach(stuff s in prods) { if(s.ID == 1) { r = s; break; } } prods.Remove(r);
要么
for(int i = 0; i < prods.Length; i++) { if(prods[i].ID == 1) { prods.RemoveAt(i); break; } }
prods.Remove(prods.Find(x => x.ID == 1));