Sortieren einer Collection

FlyingEaglELW

Grünschnabel
hallo,

hoffe ihr könnt mir etwas weiterhelfen ...

ich habe eine klasse
Code:
public class xyz
  dim m_wert1 as string 
  dim m_wert2 as string
  dim m_wert3 as string
   '...
  public property wert1 as string
  '...
 end class
ich habe weiterhin viele daten, da ich dann so der collection hinzufüge
Code:
dim x as new xyz
dim colABC as new collection
x.wert1 = "A"
x.wert2 = "B"
x.wert3 = "C"
colABC.add(x, x.wert1)
 
x.wert1 = "D"
x.wert2 = "E"
x.wert3 = "F"
colABC.add(x, x.wert1)
auf diese weise komme ich ja schön mit
Code:
dim y as new xyz
y = colABC("A")
textbox1.text = y.wert2 ' Ausgabe: B
an die gespeicherten werte.

ich möchte nun die collection sortieren nach z.b. dem Wert2.
ich habe einiges über ICompare etc. gelesen aber nichts was mir dabei helfen konnte.
habe auch ein wenig über List (Of T) gelesen, weiß die aber nicht anzuwenden - schon gleich gar nicht im oben geschilderten fall.
geschichten wie datatables würde ich hier nur ungern verwenden wollen.

ach ja, die ganze anwendung soll hinterher dann auf einem windows mobile pda laufen.

any ideas?
grüße
fly

PS: mir fällt da noch ne frage ein, ich habe eine weitere klasse, in der habe ich events definiert. wenn ich die ich jetzt z.b. in form1 per dim withevents einbinde komme ich ja nur in form1 an die events und kann entsprechend darauf reagieren. will ich die events nun in form2 nutzen muss ich die selbe klasse ja wieder in form2 einbinden. ich habe sowohl in form1 und in form2 z.b. textboxen die mit werten aus der klasse gefüllt werden sollen. wie stellt man das am geschicktesten an? oder führt kein weg an dem zweifachen deklarieren vorbei? oder sollte ich die klasse z.b. in einem modul definieren und von da aus die textboxen in beiden forms füllen?
 
Hallo Eagle,

das Interface IComparer<T> definiert die Methode
public int Compare(T x, T y)
die als Ergebnis zurückliefert:

  • Kleiner 0: x ist kleiner als y.
  • Gleich 0: x ist gleich y.
  • Größer 0: x ist größer als y.
Ein schönes Beispiel findest du hier:

http://www.aspheute.com/artikel/20020417.htm

Wenn du nach Properties sortieren willst, dann musst du den Comparer erweiter um ihm sagen zu können nach welchen er sortieren soll

Code:
MyComp comp = new MyComp();
comp.SortPropertyName = "Wert2"

Im Quelltext könnte das dann so aussehen (C#):

Code:
object xValue = typeof(T).InvokeMember(this.SortPropertyName, System.Reflection.BindingFlags.GetProperty, null, x, null);
object yValue = typeof(T).InvokeMember(this.SortPropertyName, System.Reflection.BindingFlags.GetProperty, null, y, null);

Ein Kollege von mir hat das hier mal zusammengefasst wie es gehen könnte:

http://www.konstantinpfeiffer.de/?tag=/generics
 
Zuletzt bearbeitet:
hi,

danke für die antwort, hab mich jetzt noch mal mit List(Of T) beschäftigt.

wenn ich das jetzt richtig verstehe, sind listen index basiert und können nur mit x = liste(integer_index) ausgelesen werden.

wenn ich jetzt aber nach einem string in der form "abcd" suchen will (wie man das bei collections mit dem key machen kann) geht das nicht oder ich muss per for each alle items durchgehen.

sehe ich das richtig?

wenn ich nun aber die collection weiterverwenden will, müsste ich vorher alle werte in ne list packen, die daten sortieren und dann der collection hinzufügen.

das kann doch abseits der datatable etc. nicht der einzige weg sein oder?

grüße
fly
 
mit dem c# code erhalte ich nur folgende fehler
Code:
System.NotSupportedException	{"NotSupportedException"}			
InnerException	Nothing	System.Exception
Message	"NotSupportedException"	String

in dieser zeile (fehler wird schon in der ersten zeile ausgelöst)
Code:
Dim firstSubValue As Object = GetType(T).InvokeMember(sprop.PropertyName, System.Reflection.BindingFlags.GetProperty, Nothing, x, Nothing)
Dim secondSubValue As Object = GetType(T).InvokeMember(sprop.PropertyName, System.Reflection.BindingFlags.GetProperty, Nothing, y, Nothing)

es sind mehrere werte einer eigenen klasse in der list (of t) enthalten, selbst bei .count<0 sollte es keine fehler werfen oder?

das sortieren löse ich so aus
Code:
sortWP ("Bezeichnung")
Public Sub sortWP(ByVal PropertyName As String)
        Dim comparer As New ObjectComparer(Of myClass)()
        comparer.SortPropertyName = PropertyName
        comparer.SortAscending = True
        T.Sort(comparer)    ' List(Of myClass)
End Sub

habe den c# mit dem converter hier übersetzt.
es gab nach dem konvertieren auch keinerlei fehlermeldungen, also tippfehler von mir kann ich ausschließen.

kann es ggfs. am compact framework liegen?

grüße
fly
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück