【问题标题】:Using IEquatable Equals, comparing property of objects in array使用 IEquatable Equals,比较数组中对象的属性
【发布时间】:2013-12-02 08:32:33
【问题描述】:

我正在尝试在经典的扑克/纸牌游戏类型程序中进行同花。属性是花色(红心、钻石等),数组是手。我使用了 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 循环会比较每张卡片以查找任何错误,如果是则返回错误。在 for 循环之外/之后(假设它们都是真的),我返回手中最后两张牌比较的真/假。我把它复杂化了吗?有错吗?

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

【问题讨论】:

  • hand[hand.Length] 引发异常
  • 试试for (int i = 0; i &lt; hand.Length-1; i++)
  • 是的,我在发布后立即发现了这一点。谢谢@Grundy

标签: c# for-loop boolean iequatable


【解决方案1】:

有一个更简单的方法来做到这一点

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

【讨论】:

    【解决方案2】:

    首先,小心(可能的)堆栈溢出

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 2014-06-02
      • 2014-08-07
      • 1970-01-01
      • 2021-09-09
      • 2019-06-28
      • 1970-01-01
      • 1970-01-01
      • 2016-02-01
      • 1970-01-01
      相关资源
      最近更新 更多