2009-06-12 13 views
1

Ich habe eine beobachtbare Sammlung. Ich möchte linq verwenden, um es zu sortieren. Ich habe den Eigenschaftsnamen der Eigenschaft, die ich für meinen Typ (als String) sortieren möchte.Sortieren nach Spaltenname string

Was ist der beste/schnellste Weg, dies zu tun?

Verschiedene Eigenschaftsnamen Saiten in die Funktion

Antwort

2

Sie können mit lambdas sortieren. Ich kopierte, was in der internen Klasse ist von der Datagrid verwendet:

 IEnumerable<T> sortedList = _list.ToArray<T>(); 

     foreach (SortDescription sortDescription in SortDescriptions) 
     { 
      PropertyInfo propertyInfo = typeof(T).GetProperty(sortDescription.PropertyName); 
      Func<T, object> keySelector = item => propertyInfo.GetValue(item, null); 

      switch (sortDescription.Direction) 
      { 
       case ListSortDirection.Ascending: 
        sortedList = sortedList.OrderBy(keySelector); 
        break; 
       case ListSortDirection.Descending: 
        sortedList = sortedList.OrderByDescending(keySelector); 
        break; 
       default: 
        continue; 
      } 
     } 

     T currentItem = _currentItem; 

funktioniert ganz gut und besser als zu versuchen, eine IComparer zu finden.

2

Ich habe immer nur in der Lage geführt werden, dies durch Reflexion zu tun.

var v = YouList.OrderBy(t => t.GetType().InvokeMember(sField, 
    System.Reflection.BindingFlags.GetProperty, 
    null, 
    t, 
    null) 
).ToList()); 

ich den gleichen Code gehe davon wird für eine ObservableCollection arbeiten ...

+0

Dies wird die GetProperty auf jedem einzelnen Element in der Liste aufrufen, was teuer werden wird. Das Mindeste, was Sie tun können, ist, die GetProperty aus der Schleife zu entfernen und eine lokale PropertyInfo-Variable zu speichern. – Avish

1

sollten Sie in der Lage sein, einen Ausdruck von diesem Eigenschaftsnamen zu konstruieren und zu SortiertNach passieren:

public IEnumerable<MyData> orderByDynamic(IEnumerable<MyData> objects, string propertyName) 
{ 
    var parameterExpression = Expression.Parameter(typeof(MyData), "x"); 
    var orderByExpression = Expression.Lambda<Func<MyData, TypeOfProperty>>(
     Expression.Property(parameterExpression, propertyName), 
     parameterExpression);  
    return objects.OrderBy(orderByExpression) 
} 

Das Problem ist, dass Sie den Typ der Eigenschaft zum Zeitpunkt der Kompilierung kennen müssen, damit dies funktioniert.

+0

Leider kannte ich den Eigenschaftstyp zur Kompilierzeit nicht – zachary