Help with sorting an Arraylist that contains Structures

J

Justin

Ok, I give up. I can't seem to construct a decent (productive) way of
sorting my arraylist.

I have a structure of two elements:

Structure TabStructure
Dim TabName As String
Dim FullFilePath As String
End Structure

Then for example I:

Dim tab as New TabStructure

some code

Then I add "tab" to an arraylist.

At some point I loop through my arraylist, grab data and create tabs from
it. Of course the resulting list of tabs are out of sequence.

Can someone help me to sort my array list alphabetically by
TabStructure.TabName?

I would greatly appreciate it.
 
K

Kerry Moorman

Justin,

One option is to have your structure implement the IComparable interface:

Structure TabStructure
Implements IComparable(Of TabStructure)
Dim TabName As String
Dim FullFilePath As String

Function CompareTo(ByVal other As TabStructure) As Integer
Implements IComparable(Of TabStructure).CompareTo

Return Me.TabName.CompareTo(other.TabName)

End Function

End Structure

Now ArrayList.Sort should sort the "tabs" by TabName.

By the way, I would use a class instead of a structure.

Kerry Moorman
 
B

Bill McCarthy

Hi Justin,

First, why are you using ArrayList ? You should use the generic List, eg.

Dim myList as New List(Of TabStructure)

Then, assuming you are using VB 2008, you can pass in a lambda function to
the sort method:

myList.Sort(Function(x, y) x.TabName.CompareTo(y.TabName))
 
J

Justin

First, until just now I never heard of "lists". However you mention VS2008
specifically and while I am using VS2008 I'm wanting to stay with in the
confines of framework 2. Does your suggestion do that? If so then I'll
read up on it.

Googling "VB.NET list" came up with nothing but arraylists and listboxes.

I already know arraylists and I already know how to check for dups before
adding so it was pretty simple to bang out the code. This arraylist is used
all over my app.
 
J

Justin

Eh, this is my only instance and it was just 4 lines of code. I was
wondering how to implement IComparable. Now I get it. This make much more
sense then what I was reading earlier today.

Thanks! I'll play with this tomorrow.
 
J

Jack Jackson

The generic List(Of T) is in 2.0. Its advantage over ArrayList is
that the contents of the list is typed so you don't have to cast the
contents and therefore avoid runtime errors if you make a mistake
casting the contents. I also strongly urge you to use it instead of
ArrayList.
 
J

Justin

Cool, I'll check it out. Thanks.


Jack Jackson said:
The generic List(Of T) is in 2.0. Its advantage over ArrayList is
that the contents of the list is typed so you don't have to cast the
contents and therefore avoid runtime errors if you make a mistake
casting the contents. I also strongly urge you to use it instead of
ArrayList.
 
B

Bill McCarthy

Hi Justin,

List(Of T) basically replaces ArrayList as of .NET 2.0//VB 2005. It uses
generics, so the item type is strongly typed. With value types, such as your
structure, this avoids costly boxing and unboxing the arraylist has to
perform. So you get more robust code and in many cases a bit of a
performance improvement too.

As to compiling against the 2.0 framework, in VB 2008 in project options,
compile tab, select Advanced Compile Options and set the target framework to
2.0, 3.0 or 3.5. If you are using features not supported by the target
framework, VB will warn you. The example of the lambda function I gave
should compile to 2.0 without problem. The lambda function, is basically an
inline function.

As to generics, it's been a while since I wrote much about them, but perhaps
this old article may help introduce you to them:
http://visualstudiomagazine.com/features/article.aspx?editorialsid=1731
 
J

Justin

Ok, after getting beat in the head with "class" by 4 people I converted it
to a class :)

I tried to convert my arraylist to a list and that was just an ugly mess.
Here's the first two errors I received:
'TabsArray' cannot expose type 'TabClass' outside the project through class
'frmMain'
Too few type arguments to 'System.Collections.Generic.List(Of T)'

But enough of that. I want to wrap my head around iComparable first. I'll
deal with that later.

I implemented iComparable and now when I try to .sort my arraylist I get:

"Failed to compare two elements in the array."

Again, thanks for the help everyone!
 
J

Justin

I've come across this before. When something as simple as this just isn't
working I've learned to start a whole new project and bring everything over.
Surprisingly that didn't take too long.

The error, "Failed to compare two elements in the array.", came over however
once I converted the arraylist to a list the error went away and it's now
sorting properly. Obviously the List errors did not come over as well.

I'm growing a little tired of having to start whole new projects because of
silly unexplained issues but at the same time I'm glad to be able to move
forward.

Again, thanks to everyone!
 
J

Justin

Point well taken. While my data doesn't change so this wont hurt me here, I
never knew this about structures and I'll be sure to just use classes from
now on.

Thanks!
 

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