确定两个对象是否相等

时间:2013-04-29 17:12:06

标签: c# list find equals

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

4 个答案:

答案 0 :(得分:2)

您正在测试List上的等式到Coffee的实例。这将始终返回-1。你想要的是c.Contains(x)。请记住,当您重写Equals时,您还应该为GetHashCode()提供类似的覆盖。在这里查看对象上的Microsoft advice on implementing and overriding Equals

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

public override int GetHashCode()
{
    return Name == null ? 0 : Name.GetHashCode();
}

答案 1 :(得分: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);

答案 2 :(得分:0)

你的问题在这里:

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

答案 3 :(得分:0)

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

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

    return -1;
}