使用IEquatable Equals,比较数组中对象的属性

时间:2013-12-02 08:32:33

标签: c# for-loop boolean iequatable

我正试图在经典的扑克/纸牌游戏类型计划中进行同花。该属性是西装(心,钻石等),阵列是手。我使用了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循环之外/之后(假设它们都是真的),我返回手中最后2张牌的比较的真/假。我复杂了吗?这不对吗?

编辑:我可以看到:“if(hand [i] .Equals(hand [i + 1])== false)”将超出范围异常,所以我需要一个比较卡与卡的新方法。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

有一种更简单的方法可以做到这一点

private static bool Flush(SuperCard[] hand)
{
    if(hand.Length == 0)
       return false;
    var suit = hand[0].cardSuit;
    return hand.All(c => c.cardSuit == suit);
}

答案 1 :(得分:1)

首先,要注意(可能的)堆栈溢出

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 (参见循环条件中的“长度 - 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;
}