一对扑克牌的 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();
}
}
我有一张扑克牌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();
}
}