It doesn't work and its all due to the use of a value type within the foreach loop.
Because Product entity has been declared as struct which is value type you can not directly update the Quantity property of a Product entity which is being used as the iteration variable.
It even generates a compiler error message:
“Cannot modify p because it is foreach iteration variable.”
This doesn't happen if the Product entity is declared as a Class which is a reference type. In this case
p.Quantity = p.Quantity - Quantity;
will work because it modifies the object that p refers to rather than the value of p.
If you want to use a value type in a loop in this way you have to do the job more explicity and avoid using it as the loop variable.
For example:.
for (int i = 0; i < lstProducts.Count; i++) { Product p = lstProducts[i]; if (p.Name == ProductName) { p.Quantity = p.Quantity - Quantity; lstProducts[i] = p; } }
In this case we have to retrieve the value type from the collection before we work on it.
Pattern
The only real solution is to avoid using value types within sophisticated data structures. In other words, always prefer a class to a struct. This also avoids the potential problem of some future programmer converting your struct to a class thinking that it doesn't make any difference.
Given how weakly typed Javascript is and how helpful it is with auto conversion of fundamental types you would think that converting a string to an integer would be easy and above all safe but ... not [ ... ]
Put on your thinking cap for another set of conundrums that will exercise your coding skills. This time Melvin Frammis introduces his junior partner Bugsy Cottman to some classic number puzzles that c [ ... ]