Подтвердить что ты не робот

Удалить элемент из списка на основании условия

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

Я хочу удалить продукт, где ID= 1. Я сейчас пытаюсь:

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

и он не работает.

СПАСИБО ВСЕМ

4b9b3361

Ответ 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 );
}

Ответ 2

Если ваш тип коллекции является List<stuff>, то лучший подход, вероятно, следующий:

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

Это только один проход (итерация) над списком, поэтому он должен быть более эффективным, чем другие методы.

Если ваш тип более типичен ICollection<T>, это может помочь написать короткий метод расширения, если вы заботитесь о производительности. Если нет, то вам, вероятно, удастся использовать LINQ (вызов Where или Single).

Ответ 3

Если у вас есть LINQ:

var itemtoremove = prods.Where(item => item.ID == 1).First();
prods.Remove(itemtoremove)

Ответ 4

Вы можете удалить только то, к чему у вас есть ссылка. Таким образом, вам придется искать весь список:

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;
    }
}

Ответ 5

prods.Remove(prods.Single(p=>p.ID == 1));

вы не можете изменять коллекцию в foreach, как предлагает Vincent

Ответ 6

Вы можете использовать Linq.

var prod = from p in prods
           where p.ID != 1
           select p;

Ответ 7

prods.Remove(prods.Find(x => x.ID == 1));