我有一个可观察的收藏品。我想用linq对它进行排序。我有我要为我的类型排序(作为字符串)的属性的属性名称。
最好/最快的方法是什么?
不同的propertyname字符串将传递给函数
答案 0 :(得分:2)
我只能通过反思来做到这一点。
var v = YouList.OrderBy(t => t.GetType().InvokeMember(sField,
System.Reflection.BindingFlags.GetProperty,
null,
t,
null)
).ToList());
我假设相同的代码适用于ObservableCollection ......
答案 1 :(得分:2)
您可以使用lambdas进行排序。我复制了DataGrid使用的内部类中的内容:
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;
比试图找到IComparer更好,更好。
答案 2 :(得分:1)
您应该能够从该属性名称构造一个表达式并将其传递给OrderBy:
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)
}
问题是你需要在编译时知道属性的类型才能使其工作。