1

オブジェクトが特定の基準を与えられたオブジェクトのリスト内の 1 つと等しい (名前が等しい) かどうかをテストしようとしています。そうであれば、リストに追加しないでください。この署名「static int Find(List c, Coffee 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;
    }
        }          
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

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 に答える
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 に答える