У мене така структура:
public struct stuff
{
public int ID;
public int quan;
}
і хочу видалити продукт там, де ID
є 1.
Я намагаюся це зараз:
prods.Remove(new stuff{ prodID = 1});
і це не працює.
ДЯКУЮ ВСІМ
У мене така структура:
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()
та перевірити, чи існує елемент взагалі ...
EDIT:
оскільки stuff
є структурою, SingleOrDefault()
не повертає значення null. Але він поверне за замовчуванням (stuff) , який матиме ідентифікатор 0. Коли у вас немає ідентифікатора 0 для ваших звичайних предметів-предметів, ви можете зробити запит для цього ідентифікатора:
var stuffToRemove = prods.SingleOrDefault( s => s.ID == 1 )
if( stuffToRemove.ID != 0 )
{
prods.Remove( stuffToRemove );
}
if (stuffToRemove != default(stuff))
.
Якщо ваш тип колекції a 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
Ось рішення для тих, хто хоче видалити його з бази даних за допомогою 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()
, недоступний для наборів БД сутності сутності.
prods.Remove(prods.Single(p=>p.ID == 1));
ви не можете змінити колекцію в foreach, як пропонує Вінсент
Ви можете видалити лише те, на що у вас є посилання. Тож вам доведеться здійснити пошук по всьому списку:
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;
}
}
Ви можете використовувати Linq.
var prod = from p in prods
where p.ID != 1
select p;
prods = prods.Where(p != 1).ToList()
вам ближче, але це не змінить список, який ви отримали як параметр.