Tutorial :Remove item from list based on condition


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

I want to to remove a product where ID = 1. I'm trying this currently:

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

and it's not working.



Using linq:

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

Maybe you even want to use SingleOrDefault() and check if the element exists at all ...

Since stuff is a struct, SingleOrDefault() will not return null. But it will return default( stuff ), which will have an ID of 0. When you don't have an ID of 0 for your normal stuff-objects you can query for this ID:

var stuffToRemove = prods.SingleOrDefault( s => s.ID == 1 )  if( stuffToRemove.ID != 0 )  {      prods.Remove( stuffToRemove );  }  


If your collection type is a List<stuff>, then the best approach is probably the following:

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

This only does one pass (iteration) over the list, so should be more efficient than other methods.

If your type is more generically an ICollection<T>, it might help to write a short extension method if you care about performance. If not, then you'd probably get away with using LINQ (calling Where or Single).


If you have 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));

you can't modify collection in foreach, as Vincent suggests


You could use Linq.

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


You can only remove something you have a reference to. So you will have to search the entire list:

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

Note:If u also have question or solution just comment us below or mail us on toontricks1994@gmail.com
Next Post »