【问题标题】:GetHashCode for a pair of playing cards C#一对扑克牌 C# 的 GetHashCode
【发布时间】:2021-08-04 11:57:58
【问题描述】:

我有一个扑克牌类,其 GetHashCode 方法实现如下:

public override int GetHashCode()
{
   return (int)rank * 4 + (int)suit;
}

我现在想设计一个适用于 2 张牌手/一对牌的 GetHashCode 方法。我认为这样的事情应该可行:

public override int GetHashCode()
{
    return (card1.GetHashCode() * 53) + card2.GetHashCode();
}

但是,无论卡片的顺序如何,我都希望哈希码相同。例如如果 card1 = 黑桃 A,card2 = 黑桃 K,则哈希码应该等于 card1 = 黑桃 K,card2 = 黑桃 A。 我现在想也许我可以在应用我的功能之前订购卡片,但想知道是否有人可以提出一个很好的简单方法。谢谢

编辑:这行得通吗?

        public override int GetHashCode()
        {
            if(card1.GetHashCode() > card2.GetHashCode())
            {
                return (card1.GetHashCode() * 53) + card2.GetHashCode();
            }
            return (card2.GetHashCode() * 53) + card1.GetHashCode();
        }

【问题讨论】:

  • 是的,这会起作用(编辑),但我会将哈希码放入变量中以避免多次计算

标签: c# gethashcode


【解决方案1】:

如果您使用的是 .NET Core/Standard 2.1 或更高版本,HashCode struct 提供了一些很好的帮助程序来避免自定义计算代码,即discouraged

在此用例中利用 HashCode.Combine() 的示例:

public class Card
{
    public Card(int suit, int rank)
    {
        Suit = suit;
        Rank = rank;
    }

    public int Suit { get; set; }

    public int Rank { get; set; }

    public override int GetHashCode() => HashCode.Combine(Suit, Rank);
}

public class Hand
{
    public IList<Card> Cards { get; set; }

    public Hand(IList<Card> cards)
    {
        Cards = cards;
    }

    public override int GetHashCode()
    {
        var hash = new HashCode();
        foreach (var card in Cards)
        {
            hash.Add(card);
        }

        return hash.ToHashCode();
    }
}

【讨论】:

    【解决方案2】:

    它似乎会起作用,如果有的话我会增加可能的值来解释百搭牌或其他可能的牌。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多