使用IEquatable Equals,比较数组中对象的属性
本文关键字:对象 属性 数组 比较 IEquatable Equals 使用 | 更新日期: 2024-06-14 10:29:49
我正试图在一个经典的扑克/纸牌游戏类型的程序中进行刷新。属性是套装(红心、钻石等),数组是手。我使用了IEquatable并实现了Equals方法
public bool Equals(SuperCard otherCard)
{
if (otherCard == null)
return false;
return (this.cardSuit.Equals(otherCard.cardSuit));
}
在我的Program.cs中,我正在使用.Equals为Flush编写一个bool方法。有人建议我使用for循环,但我很难理解我做得是否正确。我需要逐个卡片比较cardSuit属性。但我不知道该怎么办。如果有任何帮助,我将不胜感激。以下是我迄今为止的方法。
private static bool Flush(SuperCard[] hand)
{
for (int i = 0; i < hand.Length; i++)
{
if (hand[i].Equals(hand[i + 1]) == false)
{
return false;
}
}
return hand[hand.Length].Equals(hand[hand.Length - 1]);
}
在我看来,for循环比较每张牌,寻找任何一张假牌,如果是,则返回false。在for循环之外/之后(假设它们都是真的),我返回手牌中最后两张牌的比较结果的真/假。我是不是太复杂了?它错了吗?
编辑:我可以看到:"if(hand[I].Equals(hand[I+1])==false)"将出现越界异常,所以我需要一种新的卡对卡比较方法。有什么想法吗?
有一种更简单的方法可以实现
private static bool Flush(SuperCard[] hand)
{
if(hand.Length == 0)
return false;
var suit = hand[0].cardSuit;
return hand.All(c => c.cardSuit == suit);
}
首先,注意(可能的)堆栈溢出:
public bool Equals(SuperCard otherCard)
{
// "otherCard == null" usually calls "Equals" method which in turn
// calls "Equals" again and again...
if (Object.ReferenceEquals(otherCard, null)) // <- No "==" or "Equal" - just reference test
return false;
return (this.cardSuit.Equals(otherCard.cardSuit));
}
另一个问题是RangeCheckError(请参阅循环条件中的"Length-1")
private static bool Flush(SuperCard[] hand)
{
if (Object.ReferenceEquals(null, hand))
return false;
for (int i = 0; i < hand.Length - 1; i++) // <- Pay attention to "Length - 1"
{
if (!hand[i].Equals(hand[i + 1])) // <- "== false" is quite awkward
{
return false;
}
}
// You don't need any additional checks here:
// A[0] = A[1] = ... = A[length - 1]
return true;
}