.net ArrayList mit Objekten mehrfach sortieren

Moin moin, ich habe eine Arraylist, gefüllt mit einem Objekt namens TeileListe. TeileListe ist eine neue Klasse und enthält einen neuen Typ TeilArt und mehrere numerische Werte.

Wie kann ich die ArrayList sortieren? Aber dabei zuerst nach TeileArt.ToString, danach nach Breite und danach nach Hoehe! Ähnlich wie bei Excel: zuerst nach Spalte A, dann nach Spalte B…

Hab leider noch nichts passendes gefunden…

Viele Grüße bax

Hier ein kleines Beispiel:

Public Class Form1
Inherits System.Windows.Forms.Form

Private m\_myList As New ArrayList

 '--------------------------------------
 'Berechnungen und Erstellen der Liste
 '--------------------------------------
 Private Sub Form1\_load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
 Dim Teil As New TeileListe

 'Zuweisung diverser Teile
 Teil = New TeileListe(TeileListe.TeilArt.Seitenteil, 20, 10)
 m\_myList.Add(Teil)
 Teil = New TeileListe(TeileListe.TeilArt.Boden, 20, 10)
 m\_myList.Add(Teil)
 Teil = New TeileListe(TeileListe.TeilArt.Seitenteil, 10, 10)
 m\_myList.Add(Teil)
 Teil = New TeileListe(TeileListe.TeilArt.Deckel, 20, 40)
 m\_myList.Add(Teil)
 Teil = New TeileListe(TeileListe.TeilArt.Seitenteil, 30, 10)
 m\_myList.Add(Teil)
 Teil = New TeileListe(TeileListe.TeilArt.Seitenteil, 20, 10)
 m\_myList.Add(Teil)

 'Zum testen hier die Ausgabe in eine Textbox
 TextBox1.Text = ""
 For i As Integer = 0 To m\_myList.Count - 1
 Teil = CType(m\_myList.Item(i), TeileListe)
 TextBox1.Text &= Teil.Teil.ToString & " Breite: " & Teil.nBreite & " Höhe: " & Teil.nHoehe & Environment.NewLine
 Next
 End Sub

'--------------------------------------
Public Class TeileListe
 'Es ist ein eigener Typ drin!
 Enum TeilArt
 Seitenteil
 Deckel
 Boden
 End Enum

 Private m\_Teil As TeilArt

 'Außerdem diverse numerische Felder
 Private m\_nBreite As Integer
 Private m\_nHoehe As Integer

 Public Sub New()
 m\_Teil = TeilArt.Seitenteil
 m\_nBreite = 0
 m\_nHoehe = 0
 End Sub

 Public Sub New(ByVal Teil As TeilArt, ByVal nBreite As Integer, ByVal nHoehe As Integer)
 m\_Teil = Teil
 m\_nBreite = nBreite
 m\_nHoehe = nHoehe
 End Sub

 Property Teil() As TeilArt
 Get
 Return m\_Teil
 End Get
 Set(ByVal Value As TeilArt)
 m\_Teil = Value
 End Set
 End Property

 Property nBreite() As Integer
 Get
 Return m\_nBreite
 End Get
 Set(ByVal nValue As Integer)
 nBreite = nValue
 End Set
 End Property

 Property nHoehe() As Integer
 Get
 Return m\_nHoehe
 End Get
 Set(ByVal nValue As Integer)
 m\_nHoehe = nValue
 End Set
 End Property
End Class

Hallo!

Um das zu erreichen, musst Du Dir eine Klasse schreiben, die IComparer implementiert und mit einer Instanz dieser Klasse die Methode ArrayList.Sort() aufrufen.
Im Comparer vergleichst Du erst das ToString() auf (Un-)Gleichheit, weil die anderen Eigenschaften ja nur dann sortierungsrelevant sind, wenn man die 2 Teile anhand des 1. Kriteriums nicht unterscheiden kann.
Also sowas in der Art (in C#, aber Du kannst es bestimmt nach VB.NET portieren):

class MyComparer : IComparable
{
 public int Compare(object o1, object o2)
 {
 Teileliste tl1 = o1 as Teileliste;
 Teileliste tl2 = o2 as Teileliste;
 if (tl1 == null || tl2 == null)
 return 0;
 int res = tl1.ToString().CompareTo(tl2.ToString());
 if (res == 0) // dann wird das 2. Kriterium relevant
 {
 res = tl1.Breite.CompareTo(tl2.Breite);
 if (res == 0) // dann ist ToString und Breite gleich
 {
 return tl1.Hoehe.CompareTo(tl2.Hoehe);
 }
 else
 {
 return res;
 ]
 }
 else
 {
 return res;
 }
 }
}

...

ArrayList alTeile = new ArrayList();
alTeile.Add(...);
...
alTeile.Sort(new MyComparer());
...

Die Benennung Deiner Klassen und Eigenschaften könntest Du noch einmal überdenken. Die Präfixnotation (nBreite) ist in .NET nicht üblich und eine Instanz der Klasse „TeileListe“ enthält keine Liste sondern ein Einzelteil!

Gruß,
Martin

Danke, haut alles hin. Fürs Archiv noch die vb-Lösung:

Class MyComparer
 Implements IComparer
 Function Compare(ByVal o1 As Object, ByVal o2 As Object) As Integer Implements IComparer.Compare
 Dim tl1 As TeileListe = DirectCast(o1, TeileListe)
 Dim tl2 As TeileListe = DirectCast(o2, TeileListe)
 If tl1 Is Nothing OrElse tl2 Is Nothing Then
 Return 0
 End If
 Dim res As Integer = tl1.Teil.ToString().CompareTo(tl2.Teil.ToString())
 If res = 0 Then
 ' dann wird das 2. Kriterium relevant
 res = tl1.nBreite.CompareTo(tl2.nBreite)
 If res = 0 Then
 ' dann ist ToString und Breite gleich
 Return tl1.nHoehe.CompareTo(tl2.nHoehe)
 Else
 Return res
 End If
 Else
 Return res
 End If
 End Function
End Class

Aufruf dann über:

m\_myList.Sort(new MyComparer());

Die Benennung Deiner Klassen und Eigenschaften könntest Du
noch einmal überdenken. Die Präfixnotation (nBreite) ist in
.NET nicht üblich und eine Instanz der Klasse „TeileListe“
enthält keine Liste sondern ein Einzelteil!

Danke für den Hinweis. Hab es damals allerdings so gelernt und es war die übliche Schreibweise in der Firma. Mit TeileListe geb ich Dir natürlich recht…

LG bax