一对扑克牌的 GetHashCode C#

GetHashCode for a pair of playing cards C#

我有一张扑克牌class,GetHashCode 方法实现如下:

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

我现在想设计一个适用于 2 张 hand/pair 卡片的 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();
        }

这似乎可行,如果有的话,我会增加可能的值以说明小丑牌或其他可能的牌。

如果您使用的是 .NET Core/Standard 2.1 或更高版本,HashCode struct provides some nice helpers to avoid custom calculation code, which is 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();
    }
}