确定两个对象是否相等
本文关键字:对象 是否 两个 | 更新日期: 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;
}
c
是List<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;
}