2010-11-26 11 views
0

Ich habe eine Arraylist mit Objekten, jetzt muss ich sie sortieren.C# dynamisch Attribut zum Sortieren auswählen

Ich habe diese Methode bekam:

public Int32 CompareTo(object next) 
     { 
      SessionInfo nextCase = (SessionInfo)next; 
      return (this.Duration.CompareTo(nextCase.Duration)); 
     } 

Jetzt muss ich dynamicly die sortvalue ändern von „Dauer“ auf „Name“ Also machte ich ein Attribut namens SortColumn und gab es Wert „Dauer“

Jetzt sieht mein Code wie folgt aus:

public string SortColumn { get; set; } 

public SessionInfo() 
    { 
     SortColumn = "Duration"; 
    } 

public Int32 CompareTo(object next) 
    { 
     SessionInfo nextCase = (SessionInfo)next; 
     return (this.SortColumn.CompareTo(nextCase.SortColumn)); 
    } 

Das funktioniert nicht. Gibt es eine Möglichkeit, die zu sortierende Spalte zu ändern?

Danke!

Antwort

3

Anstatt eine Arraylist, warum nicht eine generische Liste verwenden, erhalten Sie kostenlos (fast) Sortierung:

var list = new List<SesionInfo>(); // then add items 
list.Sort((s1,s2) => s1.SortColumn.CompareTo(s2.SortColumn)); 
2
public int CompareTo(object next) 
{ 
    SessionInfo nextCase = (SessionInfo)next; 
    if(SortColumn == "Duration") 
     return (this.Duration.CompareTo(nextCase.Duration)); 
    else if(SortColumn == "Name") 
     return (this.Name.CompareTo(nextCase.Name)); 
} 
0

Der Grund, dass es nicht funktioniert, ist, dass es durch das ist das Sortieren Der Wert der SortColumn-Eigenschaft und alle Objekte in Ihrer Sammlung haben denselben Wert. Eine Möglichkeit, dies zu lösen, ist die Verwendung der Reflektion, um den Wert der Eigenschaft zu erhalten, die von der SortColumn-Eigenschaft benannt wird.

public Int32 CompareTo(object next) 
{ 
     SessionInfo nextCase = next as SessionInfo; 
     var sortProperty = this.GetType().GetProperty(this.SortColumn); 

     var currentValue = sortProperty.GetValue(this) as IComparable; 
     var nextValue = sortProperty.GetValue(next) as IComparable; 

     return currentValue.CompareTo(nextValue); 
} 

Ich habe die Ungültigkeit Kontrollen ausgelassen das Beispiel zu vereinfachen, aber Sie werden beachten müssen, was passiert, wenn die Eigenschaften geschieht nicht vergleichbar sind, werden die Werte null sind, usw.

Eine bessere Lösung wäre eine generische Liste und OrderBy-Erweiterung zu verwenden. Dann können Sie einfach tun:

var sorted = collection.OrderBy(c => c.Duration); 

oder

var sorted = collection.OrderBy(c => c.Name); 

Wenn Sie Dynamic LINQ verwenden, dann können Sie die Spalte mit Namen angeben.

var sorted = collection.OrderBy("Duration"); 
0

Ja, ich würde zustimmen, immer generische Liste für diese Art von Funktionen nutzen, wie Sie die folgenden Vorteile erhalten,

  • Typ Sicherheit
  • Bessere Leistung
  • Keine Notwendigkeit für explizites Casting
  • Bessere Wachstumsalgorithmen.

Grüße,

Sal Zaki

Verwandte Themen