That way, you don't modify the existing inner dictionary, but instead let the variable _innerProducts point to a new one.

Even simpler and better, if possible: Move the declaration of _innerProductsinside the loop that you use to fill _KitProducts. That will ensure that each loop iteration gets its own instance of the inner dictionary.