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. Но он вернет default (материал), который будет иметь идентификатор 0. Когда у вас нет идентификатора 0 для ваших обычных объектов stuff, вы можете запросить этот идентификатор:
var stuffToRemove = prods.SingleOrDefault( s => s.ID == 1 )
if( stuffToRemove.ID != 0 )
{
prods.Remove( stuffToRemove );
}
Если ваш тип коллекции является 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)
Вы можете удалить только то, к чему у вас есть ссылка. Таким образом, вам придется искать весь список:
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.Single(p=>p.ID == 1));
вы не можете изменять коллекцию в foreach, как предлагает Vincent
Вы можете использовать Linq.
var prod = from p in prods
where p.ID != 1
select p;
prods.Remove(prods.Find(x => x.ID == 1));