3

我有一个列表 <MyObj>

我还在 MyObj 类中覆盖了 Equals(Object)。

当我在我的列表上调用 indexof 时,它没有得到任何索引并且不调用 equals 。

当我调用 index of 时应该调用 Equals(Object) 的假设是否正确?

如果不是,如果我没有确切的参考,但对象在逻辑上是相同的,我如何找到 MyObj 对象,,,?

这是我正在使用的代码

 public class TreeNode<T>
    {
        private readonly List<TreeNode<T>> _children = new List<TreeNode<T>>();     

        public TreeNode(T value)
        {
            Value = value;
        }

        public virtual bool Equals(Object obj)
        {
            TreeNode<T> treeNode = (TreeNode<T>)obj;

            if (treeNode.Value.Equals(Value))
                return true;
            else
                return false;
        }


        public TreeNode<T> this[int i]
        {
            get { return _children[i]; }
        }

        public TreeNode<T> Parent { get; private set; }
        public T Value { get; set; }

        public ReadOnlyCollection<TreeNode<T>> Children
        {
            get { return _children.AsReadOnly(); }
        }

        public TreeNode<T> AddChild(T value)
        {
            var node = new TreeNode<T>(value) { Parent = this };
            _children.Add(node);
            return node;
        }

        public bool RemoveChild(TreeNode<T> node)
        {
            return _children.Remove(node);
        }

        public void Traverse(Action<T> action)
        {
            action(Value);
            foreach (var child in _children)
                child.Traverse(action);
        }


    }

这就是我所说的收藏

  int artistIndex = serverDirs.Children.IndexOf(new TreeNode<String>(artist));

在总是 -1 返回的索引中,即使该项目在孩子们那里谢谢,

4

2 回答 2

4

MSDNList<T>.IndexOf上的备注包括:

此方法使用默认相等比较器 EqualityComparer.Default 确定相等性,T 是列表中的值的类型。

如果你点击那个链接,你会发现是的,除非你IEquatable<T>为你的类实现,否则默认的比较器将同时使用你的方法GetHashCode和你的Equals方法MyObj。(你正在同时实施,对吧?

于 2012-10-27T05:47:55.490 回答
1

重建程序后查看错误列表窗口:

警告 CS0114:“ConsoleApplication1.TreeNode.Equals(object)”隐藏了继承的成员“object.Equals(object)”。要使当前成员覆盖该实现,请添加 override 关键字。否则添加新关键字。c:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll:(相关文件)

这告诉您的是,您的 Equals() 方法实际上并没有覆盖相等比较器将使用的 Equals() 方法。这就是为什么您没有看到它被调用以及为什么您从 IndexOf() 获得 -1 返回的原因。使固定:

    public override bool Equals(Object obj) {        // NOTE: override, not virtual
        TreeNode<T> treeNode = obj as TreeNode<T>;
        if (treeNode == null) return false;
        return treeNode.Value.Equals(Value);
    }

这解决了您的问题,尽管您现在收到一个新警告:

警告 CS0659:“ConsoleApplication1.TreeNode”覆盖 Object.Equals(object o) 但不覆盖 Object.GetHashCode()

不要忽视这一点,它迟早会字节。使固定:

    public override int GetHashCode() {
        return Value.GetHashCode();
    }

从中吸取的教训:不要忽视警告。当编译器标记有异味时,它通常是正确的。并且随意责怪IDE,当只有警告时它不会显示错误列表窗口。邋遢。

于 2012-10-27T07:33:33.083 回答