1
 foreach (Ant ant in state.MyAnts)
        {
            if (m_foodTasks.ContainsKey(ant))
            {
...

デバッグすることで、m_foodTasks内にまったく同じ値のアリが存在することがわかります。だから私はそれが参照アドレスを比較すると仮定します..(私は正しいですか?)

値で比較するにはどうすればよいですか?

回答を読んだ後に編集する:

情報が多すぎます...それらを研究するのに少し時間がかかりますが、これがクラスのアリがすでに持っているものです(私はそれらすべてのものが何であるかを言うことはできません):

public class Location : IEquatable<Location> {

    /// <summary>
    /// Gets the row of this location.
    /// </summary>
    public int Row { get; private set; }

    /// <summary>
    /// Gets the column of this location.
    /// </summary>
    public int Col { get; private set; }

    public Location (int row, int col) {
        this.Row = row;
        this.Col = col;
    }

    public override bool Equals (object obj) {
        if (ReferenceEquals (null, obj))
            return false;
        if (ReferenceEquals (this, obj))
            return true;
        if (obj.GetType() != typeof (Location))
            return false;

        return Equals ((Location) obj);
    }

    public bool Equals (Location other) {
        if (ReferenceEquals (null, other))
            return false;
        if (ReferenceEquals (this, other))
            return true;

        return other.Row == this.Row && other.Col == this.Col;
    }

    public override int GetHashCode()
    {
        unchecked {
            return (this.Row * 397) ^ this.Col;
        }
    }
}

public class TeamLocation : Location, IEquatable<TeamLocation> {
    /// <summary>
    /// Gets the team of this ant.
    /// </summary>
    public int Team { get; private set; }

    public TeamLocation (int row, int col, int team) : base (row, col) {
        this.Team = team;
    }

    public bool Equals(TeamLocation other) {
        return base.Equals (other) && other.Team == Team;
    }

    public override int GetHashCode()
    {
        unchecked {
            int result = this.Col;
            result = (result * 397) ^ this.Row;
            result = (result * 397) ^ this.Team;
            return result;
        }
    }
}

public class Ant : TeamLocation, IEquatable<Ant> {
    public Ant (int row, int col, int team) : base (row, col, team) {
    }

    public bool Equals (Ant other) {
        return base.Equals (other);
    }
}
4

2 に答える 2

1

等しいかどうかをチェックするときは、GetHashCode() メソッドをオーバーライドする必要があります。

public class Ant : IEquatable<Ant>
{
    private string _someField;

    public Ant(string someField)
    {
        this._someField = someField;
    }

    #region Equality members

    public bool Equals(Ant other)
    {
        if (ReferenceEquals(null, other))
        {
            return false;
        }
        if (ReferenceEquals(this, other))
        {
            return true;
        }
        return string.Equals(_someField, other._someField);
    }

    public override bool Equals(object obj)
    {
        if (ReferenceEquals(null, obj))
        {
            return false;
        }
        if (ReferenceEquals(this, obj))
        {
            return true;
        }
        if (obj.GetType() != this.GetType())
        {
            return false;
        }
        return Equals((Ant) obj);
    }

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

    #endregion
}

オプションで、比較を行う IEqualityComparer クラスを作成できます。

 private sealed class SomeFieldEqualityComparer : IEqualityComparer<Ant>
    {
        public bool Equals(Ant x, Ant y)
        {
            if (ReferenceEquals(x, y))
            {
                return true;
            }
            if (ReferenceEquals(x, null))
            {
                return false;
            }
            if (ReferenceEquals(y, null))
            {
                return false;
            }
            if (x.GetType() != y.GetType())
            {
                return false;
            }
            return string.Equals(x._someField, y._someField);
        }

        public int GetHashCode(Ant obj)
        {
            return (obj._someField != null ? obj._someField.GetHashCode() : 0);
        }
    }
于 2012-09-07T16:27:13.230 に答える
1

クラスが「参照の比較」ではなく「値の比較」として動作するようにするには、GetHash と Equals を正しく実装する必要があります。

別の (潜在的により良いオプション) は、辞書を作成するときにIEqualityComparerを提供することです。

サンプルは記事にあります。圧縮されたバージョンは次のとおりです。

Dictionary<Box, String> boxes = 
   new Dictionary<Box, string>(new BoxEqualityComparer());

class BoxEqualityComparer : IEqualityComparer<Box>
{
  public bool Equals(Box b1, Box b2)
  {
    return b1.Height == b2.Height;
  }

  public int GetHashCode(Box bx)
  {
    return bx.Height.GetHashCode();
  }
}
于 2012-09-07T16:27:47.403 に答える