Hi Gary,
Please find below an example of a strong typed collection, as you can see
the correct way of doing so is extending CollectionBase.
The only functionality not provided is Sort, for this I implemented a class
: ClassSorter , it use reflection to sort any class based on a property
without need anything from the sortee class.
If you have any doubt let me know.
Pd:
The code is not well commented as I got it from the current working project
that is not well documented yet.
The Collection is a collection of a class type named Location, you need to
change this to your correct type.
If you look the Sort method of the collection class you will see that the
first parameter is the name of the property that will be used as sort
criteria.
Hope this help,
--
Ignacio Machin,
ignacio.machin AT dot.state.fl.us
Florida Department Of Transportation
public class LocationCollect ion:CollectionB ase
{
public Location Insert( int index, Location newelem )
{
this.InnerList. Insert( index, newelem);
return newelem;
}
public Location Add( Location newelem)
{
this.InnerList. Add( newelem);
return newelem;
}
public Location this[int index]
{
get
{
return (Location) InnerList[index];
}
set
{
InnerList[index] = value;
}
}
public Location Find(int id)
{
foreach(Locatio n current in InnerList)
if ( current.ID == id )
return current;
return null;
}
public void Remove( Location elem)
{
InnerList.Remov e( elem);
}
public LocationCollect ion(){}
private LocationCollect ion( ArrayList newarray)
{
InnerList.Clear ();
foreach( Location location in newarray)
{
Add( location);
}
}
public LocationCollect ion Sort( string sortParam,
fatalcrashCore. SortDirection direction)
{
ArrayList newlist = (ArrayList)Inne rList.Clone();
ClassSorter sorter = new ClassSorter( sortParam, SortByType.Prop erty,
direction);
newlist.Sort( sorter);
return new LocationCollect ion( newlist);
}
public LocationCollect ion Clone()
{
return new LocationCollect ion( InnerList);
}
public LocationCollect ion Search(FilterCo llection filters, bool AND)
{
LocationCollect ion filtered = new LocationCollect ion ();
foreach(Locatio n point in InnerList)
{
bool matched = false;
foreach(FilterB ase filter in filters)
if ( filter.Match(po int) )
{
matched = true;
if ( !AND )
break;
}
else
{
if ( AND )
{
matched = false;
break;
}
}
if ( matched )
filtered.Add( point);
}
return filtered;
}
}
public class ClassSorter: IComparer
{
protected string sortBy;
protected SortByType sortByType;
protected SortDirection sortDirection;
#region Constructors
public ClassSorter(str ing sortBy, SortByType sortByType, SortDirection
sortDirection)
{
this.sortBy = sortBy;
this.sortByType = sortByType;
this.sortDirect ion = sortDirection;
}
#endregion
int Compare( object x, object y, string comparer)
{
if ( comparer.IndexO f( ".") != -1 )
{
//split the string
string[] parts = comparer.Split( new char[]{ '.'} );
return Compare( x.GetType().Get Property( parts[0]).GetValue(x, null) ,
y.GetType().Get Property( parts[0]).GetValue(y, null) , parts[1]
);
}
else
{
IComparable icx, icy;
icx =
(IComparable)x. GetType().GetPr operty( comparer).GetVa lue(x, null);
icy =
(IComparable)y. GetType().GetPr operty( comparer).GetVa lue(y, null);
if ( x.GetType().Get Property(compar er).PropertyTyp e ==
typeof(System.S tring) )
{
icx = (IComparable) icx.ToString(). ToUpper();
icy = (IComparable) icy.ToString(). ToUpper();
}
if(this.sortDir ection == SortDirection.D escending)
return icy.CompareTo(i cx);
else
return icx.CompareTo(i cy);
}
}
public int Compare(object x, object y)
{
return Compare( x, y, sortBy);
}
}
public enum SortByType
{
Method = 0,
Property = 1
}
public enum SortDirection
{
Ascending = 0,
Descending = 1
}
"Gary" <gf***@thoughtv ector.com> wrote in message
news:40******** *************** @news.newshosti ng.com...
I would like to make a strongly typed, sortable collection by leveraging a
Framework class. I began by looking at CollectionBase but it doesn't have
built-int sorting. I would prefer to derive from ArrayList, but if I code
an Add(MyElement) method, the original Add(object) remains exposed,
compromising type safety. I know this must be a common task, how to do
it? Thanks,
Gary