根据条件从列表中删除项目

时间:2010-07-19 07:28:04

标签: c# .net

public struct stuff
{
    public int ID;
    public int quan;
}

我想删除ID = 1的产品。我正在尝试这个:

prods.Remove(new stuff{ prodID = 1});

它没有用。

感谢所有

8 个答案:

答案 0 :(得分:152)

如果您的收藏类型是List<stuff>,那么最佳方法可能如下:

prods.RemoveAll(s => s.ID == 1)

这只对列表进行一次传递(迭代),因此应该比其他方法更有效。

如果您的类型通常是ICollection<T>,那么如果您关心性能,可能有助于编写一个简短的扩展方法。如果没有,那么你可能会使用LINQ(调用WhereSingle)。

答案 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;