【问题标题】:C# get/set solutionC# 获取/设置解决方案
【发布时间】:2013-04-16 14:00:25
【问题描述】:

为了提供一些背景知识,我正在尝试解决涉及扑克牌的 Project Euler Problem 54。尽管有无限的方法。我想做的是枚举字符串列表,例如: {“8C”、“TS”、“KC”、“9H”、“4S”};

我想为每个相应的字符串“获取”一个具有属性值和套装的类卡实例。我还没有使用 get/set,所以也许有一个我缺少的明显方法。

最终我想要一个卡片类型的对象列表,我不介意提前构建所有卡片,这样“2H”返回一个卡片类型的实例,其中套装 = 红心,价值 = 2,例如。

我知道这段代码是错误的,但它应该让我知道我正在尝试做什么。任何建议将不胜感激。

class Card
{
    public string suit;
    public int value;
    public string cardname
    {
        get 
        { 
            if (cardname == "2H") Card TwoH = new Card();
                TwoH.suit = "Hearts"
                TwoH.value = 2;
                return TwoH; 
        }
    }
}

【问题讨论】:

  • cardname != "2h" 会返回什么?此外,CardString 吗?
  • 不太清楚你的问题是什么。您想更好地设计卡片组吗?谷歌一下。
  • 我不知道你在说什么。请澄清。
  • @Ofiris:因为没有 {},所以代码总是返回红桃 2
  • 澄清,在main方法中,我想通过一个字符串列表来枚举,当字符串为“2H”时,我想调用一个方法,该方法返回一个Card类型的实例,其中花色是红心,值为2。我将建立一个卡片类型的列表,然后根据卡片类型的列表而不是字符串列表来评估手牌。

标签: c# class get set


【解决方案1】:

为什么不创建一个基于字符串参数填充西装和值的构造函数

public Card(string name)
{
    switch(name)
    {
        case "2H":
            this.suit = "Hearts";
            this.value = 2;
            break;
        //...
    }
}

【讨论】:

    【解决方案2】:

    这可能不是您所要求的确切解决方案,但如果您将获得的值(例如 2H、3C 等)都是 2 个字符长,那么您可以试试这个:

    public class Card
    {
        public string suit { get; set; }
        public int value { get; set; }
    
        public static Card GetCard(string cardName)
        {
            string tmpSuit;
            int tmpValue;
            char[] cardNameParts = cardName.ToCharArray();
            switch(charNameParts[0])
            {
                case "A":
                    tmpValue = 1;
                    break;
                case "2":
                    tmpValue = 2;
                    break;
                ...
            }
    
    
            switch(charNameParts[1])
            {
                case "H":
                    tmpSuit= "Hearts";
                    break;
                case "C":
                    tmpSuit= "Clubs";
                    break;
                ...
            }
            return new Card() { suit = tmpSuit, value = tmpValue };
        }
    }
    

    【讨论】:

      【解决方案3】:

      我会这样做:

      public class Card
      {
          public string Suit { get; set; }
          public int Value { get; set; }
      
          public static Card FromString(string s)
          {
              if (s == "2H") return new Card() { Suit = "Hearts", Value = 2 };
              else if (s == "....")
              ...
              else return null;
          }
      }
      

      我已将您的 suitvalue 字段转换为属性,而不是一些在您的情况下不起作用的 getter 方法,我添加了一个静态方法。

      你可以这样使用Card card2H = Card.FromString("2H");

      【讨论】:

      • 是的,这看起来不错,我试试看。
      • 与其检查 52 个字符串,我会考虑解析出西装和价值 -- string suit = s.Substring(s.Length - 1); int.TryParse(s.Substring(0,s.Length-1), out value); return new Card {Suit = GetSuitEnum(suit), Value = value);。我会为西装使用 Enum,并让 GetSuitEnum 获取单字符串并返回枚举值。
      • 是的,当然。我想让代码接近原始帖子中的代码。但是解析是更好的方法。
      • 我认为您还需要一个字符或字符串作为面卡的值。
      【解决方案4】:

      也许首先使用两个switch 语句

      switch (cardname[0])
      {
          ...
      }
      

      然后

      switch (cardname[1])
      {
          ...
      }
      

      在此之前,请检查 cardname.Length == 2。在每个switch 中,都有一个default 部分,您可以在其中抛出异常,以防char 值没有意义。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-01-18
        • 1970-01-01
        • 2015-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多