1

我正在尝试测试一个对象是否等于给定特定条件的对象列表中的一个(名称相等),如果是,则不要将其添加到列表中,否则添加它。我必须使用具有此签名“static int Find(List c, Coffee x)”的方法。Find 在 c 中寻找 x 并返回一个有效的索引(即 0, 1, ...)如果 x 存在于 c 中,否则返回 -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;
    }
        }          
4

4 回答 4

2

您正在测试 List 与 Coffee 实例的相等性。这将始终返回 -1。你想要的是 c.Contains(x)。请记住,当您覆盖 Equals 时,您还应该为 GetHashCode() 提供类似的覆盖。在此处查找有关在对象上实现和覆盖 Equals 的 Microsoft 建议

public int Find(List<Coffee> c, Coffee x) {
    return c.IndexOf(x);
}

public override int GetHashCode()
{
    return Name == null ? 0 : Name.GetHashCode();
}
于 2013-04-29T17:21:27.993 回答
0

你的错误在这里:

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);
于 2013-04-29T17:19:16.733 回答
0

你的问题在这里:

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

    return -1;
}

c是一个List<Coffee>不是Coffee对象。

您需要更改代码,以便它遍历列表以查看它是否包含x

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

return -1
于 2013-04-29T17:20:06.843 回答
0

您可以执行以下操作,因为您有Equals方法可以使用它来查找匹配项

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

    return -1;
}
于 2013-04-29T17:23:39.360 回答