我正在尝试测试对象列表中的对象是否等于给定某些条件(名称相同)的对象,如果是,则不要将其添加到列表中,否则添加它。我必须使用具有此签名的方法“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;
}
}
答案 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;
}
c
是List<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;
}