Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取具有不同键的重复值的枚举变量的值_C#_Enums - Fatal编程技术网

C# 获取具有不同键的重复值的枚举变量的值

C# 获取具有不同键的重复值的枚举变量的值,c#,enums,C#,Enums,我列举了52张扑克牌,如下所述 public enum Card { AceClubs = 11, AceDiamonds = 11, AceHearts = 11, AceSpades = 11, DeuceClubs = 2, DeuceDiamonds = 2, DeuceHearts = 2, DeuceSpades = 2, EightClub

我列举了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));
但它返回列表中的重复键


您可以使用Linq从阵列中删除重复项:

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

你的错误是对不同的事物使用相同的值。枚举不具有重复的值(除非它们的含义相同)

当程序运行时,枚举被保存为整数,而不是名称

然后,调试器从程序(4)中获取一个整数,并将其显示为可以找到的第一个枚举(4)。这只是为了调试时的方便-程序仍然使用整数(4)。

我建议使用两个枚举作为suit和value:

然后执行扩展方法以获取实际卡值(因为
Jack
Ace
都对应于
11
):

最后

  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()); 
公共类卡{
公共卡(CardSuit套装、CardValue){
西装=西装;
价值=价值;
}
公共卡套装{get;private set;}
公共CardValue{get;private set;}
}
...
卡片[]包装=枚举
.GetValues(类型(CardSuit))
第()类
.SelectMany(suit=>Enum
.GetValues(类型(CardValue))
第()类
.选择(值=>新卡(套装,值)))
.ToArray();
//TODO:在这里洗牌
卡片[]手=包.拿(5.ToArray();
int handValue=hand.Sum(card=>card.Value.ActualValue());

使用Enum.GetNames而不是Enum.GetValues

似乎您需要两个枚举:一个用于西服(
梅花..黑桃
),另一个用于值(
Ace..King
)您的枚举将像这样工作,因为您使用了重复的值-之前有一篇关于卡片的帖子-家庭作业?你一定和这个家伙在同一个班里,可能会提到这个问题:我想OP希望集合说,例如,空格王牌(=1),梅花王牌(=1),等等。做一个
Distinct()
只会显示13个值,这不是我们想要的。那时会有13条记录可用。
  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());