'C# Unity Inventory - List.FindAll() not working as expected

I am super new to C#, so apologies if this is a simple question or has already been answered. I've been looking at other SO questions, trying the exact methods they use, and am still having no luck.

In Unity, I have an Inventory Object class that I can use to create Inventories in my game:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[CreateAssetMenu(fileName = "New Inventory", menuName = "Inventory System/Inventory")]

public class InventoryObject : ScriptableObject
{
    public List<InventorySlot> Container = new List<InventorySlot>();

    public void AddItem(ItemObject newItem, int itemAmount)
    {
      bool inventoryHasItem = false;

      for (int i = 0; i < Container.Count; i++)
      {
        if (CurrentSlotHasItem(Container[i], newItem)) {

          if (Container.FindAll((InventorySlot currentSlot) => CurrentSlotHasItem(currentSlot, newItem)).Count < newItem.maxStackSize)
          {
            Container[i].AddAmount(itemAmount);
            inventoryHasItem = true;
            break;
          }
        }
      }

      if (!inventoryHasItem)
      {
        Container.Add(new InventorySlot(newItem, itemAmount));
      }
    }

    private bool CurrentSlotHasItem(InventorySlot currentSlot, ItemObject item)
    {
      return currentSlot.item == item;
    }
}

[System.Serializable]
public class InventorySlot
{
  public ItemObject item;
  public int amount;

  public InventorySlot(ItemObject _item, int _amount)
  {
    item = _item;
    amount = _amount;
  }

  public void AddAmount(int value)
  {
    amount += value;
  }
}

This works great, except for this line:

Container.FindAll((InventorySlot currentSlot) => CurrentSlotHasItem(currentSlot, newItem)).Count < newItem.maxStackSize

For some reason, no matter what I use for the findAll() predicate, I always get the same amount in my inspector - 1. Which means that .Count never goes above 1, and I can go way above my ItemObject.maxStackSize.

This is an example ItemObject class I have:

using UnityEngine;

[CreateAssetMenu(fileName = "New Food Object", menuName = "Inventory System/Items/Food")]

public class FoodObject : ItemObject
{
    public int healthAmount;

    private void Awake() {
        type = ItemType.Food;
        maxStackSize = 25;
    }
}

This is also my Player script that adds the items to the inventory. It just adds them based off of OnTriggerEnter.

public class Player : MonoBehaviour
{
    public InventoryObject inventory;

    private void OnTriggerEnter(Collider other)
    {
        var item = other.GetComponent<Item>();

        if (item)
        {
            inventory.AddItem(item.item, 1);
            Destroy(other.gameObject);
        }    
    }
}

Here's some screenshots of my Unity console/inspector, with these two lines added to my InventoryObject class. You can see that .Count never going above 1.

if (CurrentSlotHasItem(Container[i], newItem)) {

  Debug.Log(Container.FindAll((InventorySlot currentSlot) => CurrentSlotHasItem(currentSlot, newItem)).Count);
  Debug.Log(Container[i].amount);

// rest of class

Ore Object Definition Unity Console Inventory Item



Solution 1:[1]

I don't know what I was thinking here. All I needed to do to get maxStackSize to work was changing the logic inside of AddItem:

for (int i = 0; i < Container.Count; i++)
{
        if (Container[i].item.id == newItem.id) {
          if (Container[i].amount < newItem.maxStackSize)
          {
            Container[i].AddAmount(itemAmount);
            inventoryHasItem = true;
            break;
          }
        }
}

It just compares Container[i].amount to newItem.maxStackSize. If it's under, it will stack the item. Otherwise, it creates a new item in the inventory.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Otter