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


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

Я хочу удалить продукт, где ID = 1. Я пытаюсь это в настоящее время:

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

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

СПАСИБО ВСЕМ

7 51

7 ответов:

С помощью linq:

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

может быть, вы даже хотите использовать SingleOrDefault() и проверьте, существует ли элемент вообще ...

EDIT:
Так как stuff - это структура, SingleOrDefault() не вернет null. Но он вернется default (stuff ), который будет иметь идентификатор 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 (calling Where или Single).

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

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

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

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

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

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

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

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