public struct stuff
{
public int ID;
public int quan;
}
我想删除ID
= 1的产品。我正在尝试这个:
prods.Remove(new stuff{ prodID = 1});
它没有用。
感谢所有
答案 0 :(得分:152)
如果您的收藏类型是List<stuff>
,那么最佳方法可能如下:
prods.RemoveAll(s => s.ID == 1)
这只对列表进行一次传递(迭代),因此应该比其他方法更有效。
如果您的类型通常是ICollection<T>
,那么如果您关心性能,可能有助于编写一个简短的扩展方法。如果没有,那么你可能会使用LINQ(调用Where
或Single
)。
答案 1 :(得分:45)
使用linq:
prods.Remove( prods.Single( s => s.ID == 1 ) );
也许您甚至想要使用SingleOrDefault()
并检查元素是否存在...
修改强>
由于stuff
是结构,SingleOrDefault()
不会返回null。但它将返回默认(东西),其ID为0.如果您的普通 stuff-objects没有ID为0,则可以查询这个ID:
var stuffToRemove = prods.SingleOrDefault( s => s.ID == 1 )
if( stuffToRemove.ID != 0 )
{
prods.Remove( stuffToRemove );
}
答案 2 :(得分:3)
如果你有LINQ:
var itemtoremove = prods.Where(item => item.ID == 1).First();
prods.Remove(itemtoremove)
答案 3 :(得分:1)
prods.Remove(prods.Find(x => x.ID == 1));
答案 4 :(得分:1)
对于那些想使用实体框架将其从数据库删除的人来说,这是一个解决方案:
prods.RemoveWhere(s => s.ID == 1);
扩展方法本身:
using System;
using System.Linq;
using System.Linq.Expressions;
using Microsoft.EntityFrameworkCore;
namespace LivaNova.NGPDM.Client.Services.Data.Extensions
{
public static class DbSetExtensions
{
public static void RemoveWhere<TEntity>(this DbSet<TEntity> entities, Expression<Func<TEntity, bool>> predicate) where TEntity : class
{
var records = entities
.Where(predicate)
.ToList();
if (records.Count > 0)
entities.RemoveRange(records);
}
}
}
P.S。这模拟了RemoveAll()
方法,该方法不适用于实体框架的数据库集。
答案 5 :(得分:0)
您只能删除您有引用的内容。所以你必须搜索整个列表:
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;
}
}
答案 6 :(得分:0)
prods.Remove(prods.Single(p=>p.ID == 1));
你无法修改foreach中的集合,正如Vincent建议的那样
答案 7 :(得分:0)
你可以使用Linq。
var prod = from p in prods
where p.ID != 1
select p;