ArrayList.IndexOf(Object obj) functionality changed in .Net 2.0

G

Guest

Has anyone else noticed a change in this function with .Net 2.0?

The help says it uses the Object.Equals method to do a linear search of the
ArrayList. In .Net 1.1, it used the Object.Equals override of the argument
to the method, in .Net 2.0 it uses the Object.Equals override of the elements
of the array. It's a subtle change but was more useful before. As it stands
now, one override of Object.Equals is used for all searches whereas before
you could create a new search object if you wanted to search on a different
parameter. It's simliar to what we used to do with predicate
objects/functions in STL.
 
B

Bruno Jouhier

Your Equals override should conform to the semantics of Equals. In
particular, it should be symmetric:

o1.Equals(o2) == o2.Equals(o1) when o1 and o2 are not null.

If you follow this rule, you should get the same result with the 1.1 and 2.0
versions.

It looks like you are distorting the semantics of Equals and relying on
special undocumented characteristics of the framework implementation. Then
you are on your own, and you have to be ready for some surprises when the
framework evolves.

Bruno.
 
J

Jon Skeet [C# MVP]

SailBoffin said:
Has anyone else noticed a change in this function with .Net 2.0?

The help says it uses the Object.Equals method to do a linear search of the
ArrayList. In .Net 1.1, it used the Object.Equals override of the argument
to the method, in .Net 2.0 it uses the Object.Equals override of the elements
of the array. It's a subtle change but was more useful before. As it stands
now, one override of Object.Equals is used for all searches whereas before
you could create a new search object if you wanted to search on a different
parameter. It's simliar to what we used to do with predicate
objects/functions in STL.

Unfortunately, ArrayList makes this tricky - but List<T> has FindIndex
which takes a Predicate delegate, which is the right way of doing this.
As Bruno says, Object.Equals should be consistent so that the result is
the same either way.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top