确定两个对象是否相等

本文关键字:对象 是否 两个 | 更新日期: 2023-09-27 18:11:17

我试图测试一个对象是否等于给定某些条件的对象列表中的一个(是否名称相等),如果是,不要将其添加到列表中,否则添加它。我必须使用这个签名的方法"静态int查找(列表c,咖啡x)"。Find在c中查找x,如果x在c中存在,则返回有效索引(即0,1,…),否则返回-1。当我传递精确匹配时,我的equals方法似乎没有意识到名称是相同的。为什么会这样?下面是我的代码:

        Coffee obv = new Coffee();
        Decaf decafCoffee = null;
        Regular regularCoffee = null;
        List<Coffee> inventory = new List<Coffee>();
        if (some sxpression)
            {
                decafCoffee = new Decaf(name, D, C, M);
                find = obv.Find(inventory, decafCoffee);
                if (find == -1)
                {
                    inventory.Add(decafCoffee);
                }
            }

          public class Coffee : IDisposable
          {
              public override bool Equals(object obj)
              {
                  if (obj is Coffee)
                  {
                    bool isNameEqual = Name.Equals(this.Name);
                 return (isNameEqual);
                  }
        return false;
    }
        public int Find(List<Coffee> c, Coffee x)
    {
        if (c.Equals(x))
        {
            return 0;
        }
        return -1;
    }
        }          

确定两个对象是否相等

您正在测试List与Coffee实例的相等性。它总是返回-1。你想要的是c contains (x)请记住,当你重写Equals时,你也应该为GetHashCode()提供类似的重写。查看微软关于在对象上实现和重写Equals的建议。

public int Find(List<Coffee> c, Coffee x) {
    return c.IndexOf(x);
}
public override int GetHashCode()
{
    return Name == null ? 0 : Name.GetHashCode();
}

您的错误在这里:

public int Find(List<Coffee> c, Coffee x)
{
    if (c.Equals(x))  // <-- this will never return true
    {
        return 0;
    }
    return -1;
}

但是,您的Find方法是不必要的。使用List<T>.IndexOf来保持你的概念:

var index = inventory.IndexOf(decafCoffee);

你的问题在这里:

public int Find(List<Coffee> c, Coffee x)
{
    if (c.Equals(x))
    {
        return 0;
    }
    return -1;
}

cList<Coffee>对象而不是Coffee对象。

你需要修改你的代码,以便它在列表上迭代,看看它是否包含x:

for (int i = 0; i < c.Count; ++i)
    if (c[i].Equals(x))
        return i;
return -1

您可以这样做,因为您有Equals方法,您可以使用它来查找匹配项

public int Find(List<Coffee> c, Coffee x)
{
    if (c.Any(i=>i.Equals(x))
    {
        return 0;
    }
    return -1;
}