我有一个这样的结构:
public struct stuff
{
public int ID;
public int quan;
}
并要删除产品所在的ID
位置1。
我目前正在尝试这样做:
prods.Remove(new stuff{ prodID = 1});
而且不起作用。
谢谢大家
Answers:
使用linq:
prods.Remove( prods.Single( s => s.ID == 1 ) );
也许您甚至想使用SingleOrDefault()
并检查该元素是否根本存在...
编辑:
由于stuff
是一个结构,SingleOrDefault()
将不会返回null。但是它将返回default(stuff),其ID为0。如果您的普通填充物对象的ID不为0,则可以查询以下ID:
var stuffToRemove = prods.SingleOrDefault( s => s.ID == 1 )
if( stuffToRemove.ID != 0 )
{
prods.Remove( stuffToRemove );
}
if (stuffToRemove != default(stuff))
。
如果您的集合类型是List<stuff>
,则最好的方法可能是以下方法:
prods.RemoveAll(s => s.ID == 1)
这只会对列表进行一次遍历(迭代),因此应该比其他方法更有效。
如果您的类型更一般地是ICollection<T>
,则如果您关心性能,可能会写一个简短的扩展方法。如果没有,那么您可能会放弃使用LINQ(调用Where
或Single
)。
如果您有LINQ:
var itemtoremove = prods.Where(item => item.ID == 1).First();
prods.Remove(itemtoremove)
where
查询作为参数传递给First()
Where
为First
您只能删除自己引用的内容。因此,您将必须搜索整个列表:
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;
}
}
对于那些想要使用Entity Framework从数据库中删除它的人来说,这是一个解决方案:
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);
}
}
}
PS这模拟RemoveAll()
了实体框架的数据库集不可用的方法。