M.S.
M.S.

Reputation: 4423

Get values of an enum variable having duplicate values with different keys

I've an Enum for 52 playing cards, as mentioned below,

public enum Card
{
        AceClubs = 11,
        AceDiamonds = 11,
        AceHearts = 11,
        AceSpades = 11,
        DeuceClubs = 2,
        DeuceDiamonds = 2,
        DeuceHearts = 2,
        DeuceSpades = 2,
        EightClubs = 8,
        EightDiamonds = 8,
        EightHearts = 8,
        EightSpades = 8,
        FiveClubs = 5,
        FiveDiamonds = 5,
        FiveHearts = 5,
        FiveSpades = 5,
        FourClubs = 4,
        FourDiamonds = 4,
        FourHearts = 4,
        FourSpades = 4,
        JackClubs = 11,
        JackDiamonds = 11,
        JackHearts = 11,
        JackSpades = 11,
        KingClubs = 13,
        KingDiamonds = 13,
        KingHearts = 13,
        KingSpades = 13,
        NineClubs = 9,
        NineDiamonds = 9,
        NineHearts = 9,
        NineSpades = 9,
        QueenClubs = 12,
        QueenDiamonds = 12,
        QueenHearts = 12,
        QueenSpades = 12,
        SevenClubs = 7,
        SevenDiamonds = 7,
        SevenHearts = 7,
        SevenSpades = 7,
        SixClubs = 6,
        SixDiamonds = 6,
        SixHearts = 6,
        SixSpades = 6,
        TenClubs = 10,
        TenDiamonds = 10,
        TenHearts = 10,
        TenSpades = 10,
        ThreeClubs = 3,
        ThreeDiamonds = 3,
        ThreeHearts = 3,
        ThreeSpades = 3
  }

I want to create a list from enum

 var cards = Enum.GetValues(typeof(Card));

but it returns duplicate keys in list.

enter image description here

Upvotes: 3

Views: 1755

Answers (4)

Yiming
Yiming

Reputation: 421

use Enum.GetNames instead of Enum.GetValues

Upvotes: 2

Dmitrii Bychenko
Dmitrii Bychenko

Reputation: 186813

I suggested using two enums for suit and value:

  public enum CardSuit {
    Clubs = 1,
    Diamonds = 2,
    Hearts = 3,
    Spades = 4,
  };

  public enum CardValue {
    Ace = 1,
    Deuce = 2, 
    ...
    King = 13,
  };

then implement an extension method to get actual card value (since both Jack and Ace corresponds to 11):

  public static class ValueExtensions() {
    public static int ActualValue(this CardValue value) { 
      if (value == CardValue.Ace)
        return 11; // Ace is 11
      else
        return (int) value;
    } 
  }

Finally

  public class Card {
    public Card (CardSuit suit, CardValue value) {
      Suit = suit;
      Value = value;  
    }

    public CardSuit Suit {get; private set;} 
    public CardValue Value {get; private set;} 
  }

  ...

  Card[] pack = Enum
    .GetValues(typeof(CardSuit))
    .OfType<CardSuit>()
    .SelectMany(suit => Enum
      .GetValues(typeof(CardValue))
      .OfType<CardValue>()
      .Select(value => new Card(suit, value)))
    .ToArray();

  //TODO: Shuffle the pack here
  Card[] hand = pack.Take(5).ToArray();

  int handValue = hand.Sum(card => card.Value.ActualValue()); 

Upvotes: 1

user1023602
user1023602

Reputation:

Your mistake is to use the same value for different things. Enums are not intended to have duplicate values (unless they mean the same thing).

When the program is running, enums are held as integers - not names.

The debugger then takes an integer from the program (4) and displays it as the first enum it can find (FourClubs). This is just for your convenience when debugging - the program still uses the integer (4).

Upvotes: 0

Henningsson
Henningsson

Reputation: 1315

You can remove the duplicates from the array using Linq:

var uniqueCards = cards.Distinct().ToArray();

Upvotes: -1

Related Questions