2016-04-14 2 views
1

Я в Enum для 52 игральных карт, как указано ниже,Получить значения переменной перечислимого, имеющие одинаковые значения с разными ключами

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 
    } 

Я хочу, чтобы создать список из перечисления

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

, но он возвращает повторяющиеся ключи в списке.

enter image description here

+5

кажется, что вы хотите * два * перечислений: один для костюмов ('Clubs..Spades') и еще один для * значений * (' Ace..King') –

+2

Ваше перечисление будет работать как это потому, что вы использовали повторяющиеся значения - раньше была такая запись о карточках - домашнее задание? Вы должны быть в том же классе, что и этот парень http://stackoverflow.com/questions/36622788/c-sharp-index-number-randomly-generated-and-put-into-array-to-not-occur-again- s/36622956 # 36622956 – BugFinder

+0

Возможно, обратитесь к этому вопросу: [* Не уникальные значения перечисления *] (http://stackoverflow.com/q/8043027/1364007) –

ответ

-1

Вы можете удалить дубликаты из массива с помощью Linq:

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

Я думаю, что OP хочет, чтобы коллекция * говорила *, для экземпляр Ace of spaces (= 1), Ace of Clubs (= 1) и т. д. Выполнение 'Distinct()' будет просто показывать 13 значений, чего не требуется. –

+0

тогда будет 13 записей. –

0

Ваша ошибка состоит в том, чтобы использовать то же значение для различных вещей. Перечисления не предназначены для получения повторяющихся значений (если они не означают одно и то же).

Когда программа запущена, перечисления хранятся как целые числа, а не имена.

Отладчик затем берет целое число из программы (4) и отображает его как первое перечисление, которое он может найти (FourClubs). Это просто для вашего удобства при отладке - программа по-прежнему использует целое число (4).

0

Я предложил использовать два перечисления для костюма и значения:

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

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

затем реализовать метод расширения, чтобы получить фактическое значение карты (так как Jack и Ace соответствуют 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; 
    } 
    } 

Наконец

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()); 
Смежные вопросы