How to handle identifying duplicate scriptable objects?

Hello,
I’m working on a card based game where the cards are scriptable objects (shown below)

public class Card : ScriptableObject 
{
    public string cardName;
    public string description;

    public Sprite sprite;

    public int baseDefense; 
    public int baseWealth;
    public int baseAttack;
}

and I have a Deck object that persists between scenes and holds a List of all the player’s (scriptable object) cards:

I’m looking for a way to tell how many times a specific card has been played, but this becomes a problem for duplicate cards, because I can’t simply increment a number on the scriptable object card (it would update on all cards of that type). So if (for example) I wanted to keep track of how many times the element 4 card had been played without updating all the other “farmer cards”, how should I go about that? Should I give up on scriptable objects and just use a gameobject instead?
Another detail: cards are not removed from this deck when they’re played, they’re added to a new and separate draw and discard List, but there are still times where cards are added and removed from the deck. Thanks.

You could create a manager object to keep track of the card count.
I’ld add a new property to the card SO’s to identify type of card
eg:

public enum CardTypeNames {
     Beggar_Card = 0,
     Farmer_Card = 1,
     Squire_Card = 2,
     Nihil_Card = 3
}

And then in your Scriptable Object, adding a “CardTypeNames” value.

Now whenever you pull a new card send this new property to a card manager which will keep track of the cards in a list, array or whatever feel most comfortable.

public static class CardManager {
     public static int[ , ] cardCounts;

     //Creates a new 2D array to keep track of cards
     //Make sure to call "CardManager.ResetCardArray()" when a map / session is loaded
     public static void ResetCardArray() {
          cardCounts = new int[ System.Enum.GetValues( typeof( CardTypeNames )).Length, 1 ]();
     }

    public static void IncreaseCardCount( CardTypeNames card ){
          cardCounts[ (int)card, 0 ]++;  //Increase the count of target card
     }

     public static void ReduceCardCount( CardTypeNames card ) {
          cardCounts[ (int)card, 0 ]--;    //Reduce the count of target card
     }

     public static int GetCardCount( CardTypeNames card ) {
           return cardCounts[ (int)card, 0 ];   //Retrieve the amount of cards of specified type that exist
      }
}

Notice that in my example the cardCount array is not assigned by default, since it use Enum.GetValues to determine the size of one dimension therefore, one would have to call “CardManager.ResetCardArray();” whenever a new map is loaded.