1

所以我使用 CollectionBase 作为自定义集合的继承类。我通过一个抽象类使用 CollectionBase,这样我就不会重复知识(遵循 DRY 原则)。抽象类也被定义为泛型类。这是我实施课程的方式:

 public abstract class GenericCollectionBase<T,C> : CollectionBase
 {
      //Indexders, virtual methods for Add, Contains, IndexOf, etc
 }

我利用它,所以我不必在 10 多个类中实现这些基本方法。

我的问题是,当我像这样覆盖 Equals 方法时,我是否走得太远了:

    public override bool Equals(object obj)
    {
        if (obj is C)
        {
            GenericCollectionBase<T, C> collB = 
                obj as GenericCollectionBase<T, C>;

            if (this.Count == collB.Count)
            {
                for (int i = 0; i < this.Count; ++i)
                {
                    if (!this[i].Equals(collB[i]))
                        return false;
                }
                return true;
            }
        }
        return false;
    }

我是否试图用我的摘要完成太多,还是以正确的方式做这件事?

编辑:这是为 .Net 2.0 编写的,无法访问 3.5 来利用 LINQ 之类的东西

4

4 回答 4

3

我不相信你试图完成太多。如果一个抽象类根本没有任何实现,或者其他定义功能的方法,那么它们就是接口。

我唯一要改变的是使用EqualityComparer<T>而不是 equals 来比较this[i]and collB[i]

于 2009-02-12T16:52:12.320 回答
1

好吧,首先,这很奇怪:

    if (obj is C)
    {
        GenericCollectionBase<T, C> collB = obj as GenericCollectionBase<T, C>;

我假设你的意思是:

    GenericCollectionBase<T, C> collB = obj as GenericCollectionBase<T, C>;
    if (collB != null)
    {
        ...

我认为你想多了,除非你真的,真的需要两个具有相同内容的不同集合被认为是平等的。我会将这个逻辑放在另一个方法中,以便显式调用或在相等比较器中。

于 2009-02-12T16:57:45.770 回答
0

对 IDictionary 进行扩展方法会更有用。还有像 LINQ 中的 Intersect 这样的方法可能很有用。

于 2009-02-12T16:51:23.323 回答
0

我不知道你是否试图完成太多,但我认为你试图完成错误的事情。在某些情况下,您可能希望集合具有这种类型的相等性,但它应该是可选的,并且从类型的名称中显而易见。我已经使用您正在使用的相等类型创建了一个 ListValue<>,但它也始终是不可变的。

此外,如果您要进行这种类型的相等性检查,使用 object.ReferenceEquals 的初始测试可以使您在将对象与其自身进行比较时不必遍历大型集合。

于 2009-10-15T14:43:14.393 回答