所以我利用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这样的东西
答案 0 :(得分:3)
我不相信你想要做太多。如果抽象类本来没有任何实现,或者其他定义功能的方法,那么它们就是接口。
我唯一要改变的是使用EqualityComparer<T>
代替等号来比较this[i]
和collB[i]
。
答案 1 :(得分: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)
{
...
我认为你过度思考这个问题,除非你确实需要两个具有相同内容的不同的集合,否则它们将被视为相等。我将这个逻辑放在另一个显式调用的方法中或者在相等比较器中调用。
答案 2 :(得分:0)
对IDictionary进行扩展方法会更有用。还有像LINQ中的Intersect这样的方法可能很有用。
答案 3 :(得分:0)
我不知道你是否想要完成太多,但我认为你正在努力完成错误的事情。在某些情况下,您可能希望集合具有相同类型的相等性,但它应该是选择性的,并且从类型名称中可以明显看出。我创建了一个ListValue&lt;&gt;与你正在使用的平等类型,但它总是不可变的。
另外,如果你要进行这种类型的相等检查,使用object.ReferenceEquals进行初始测试可以避免在将对象与自身进行比较时迭代大型集合。